2017-02-24 96 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 –