2017-02-24 29 views
0

这是没有变的选择我的查询SELECT产品变SQL

SELECT p.*, pd.`name` AS `product_name` 
FROM `product` AS `p` 
LEFT JOIN `product_description` AS `pd` ON p.`id` = pd.`product_id` 
LEFT JOIN `product_to_variant` AS `pv` ON p.`id` = pv.`product_id` 
WHERE p.`status` = 0 
GROUP BY p.`id` 
ORDER BY p.`id` DESC; 

SQLFiddle:http://sqlfiddle.com/#!9/8955b/5

和follwing查询有变种的选择,但它不能正常工作

SELECT p.*, pd.`name` AS `product_name` 
FROM `product` AS `p` 
LEFT JOIN `product_description` AS `pd` ON p.`id` = pd.`product_id` 
LEFT JOIN `product_to_variant` AS `pv` ON p.`id` = pv.`product_id` 
WHERE p.`status` = 0 
    AND (pv.`feature_id` = 2 AND pv.`variant_id` = 6) 
    AND (pv.`feature_id` = 3 AND pv.`variant_id` = 11) 
GROUP BY p.`id` 
ORDER BY p.`id` DESC; 

和我也试图查询但没有输出

SELECT pv.* FROM `product_to_variant` AS `pv` 
WHERE (pv.`feature_id` = 2 AND pv.`variant_id` = 2) 
    AND (pv.`feature_id` = 3 AND pv.`variant_id` = 11) 

你还有什么其他的想法如何接收产品:通过特定variant_id 6和11 http://prntscr.com/ect2oh

+0

那些GROUP BY无效。将在新版本的MySQL版本上引发错误(除非在兼容模式下)。一般的GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或者是一个集合的参数功能! – jarlh

回答

0

这里14,15是一个方法,你想要做什么:

SELECT p.*, pd.name AS product_name 
FROM product p LEFT JOIN 
    product_description pd 
    ON p.id = pd.product_id JOIN 
    product_to_variant pv 
    ON p.id = pv.product_id 
WHERE p.status = 0 AND 
     ((pv.feature_id = 2 AND pv.variant_id = 6) OR 
     (pv.feature_id = 3 AND pv.variant_id = 11) 
    ) 
GROUP BY p.id 
HAVING COUNT(DISTINCT feature_id) = 2 
ORDER BY p.id DESC; 

注:

  • 没有行可以满足您的原始条件。因为一列不能同时有两个值。因此,OR而不是AND
  • HAVING子句检查两个值是否匹配。
  • 不需要LEFT JOINpv,因为您正在检查WHERE子句中该表的值 - 必须匹配。
  • LEFT JOINpa可能也是不必要的。
  • 在任何地方使用反引号只会使查询难以写和读。
+0

谢谢,但有一个问题如果2个产品具有相同的功能 –

+0

任何其他想法接收variant_id 6和11的产品14,15? http://prntscr.com/ect2oh –

+0

@JohnAndrea。 。 。这是一个什么问题?你知道'COUNT(DISTINCT)'是做什么的吗? –

0

也许是这样的:

SELECT pv.* FROM `product_to_variant` AS `pv` 
WHERE (pv.`feature_id` = 2 AND pv.`variant_id` = 2) 
OR (pv.`feature_id` = 3 AND pv.`variant_id` = 11) 

代替AND,它说,你需要的结果都feature_idvariant_id,使用OR因为它需要两个。

+0

是的,但我需要“和” –

+0

prntscr.com/ect2oh –