[英]Multiple row conditions in WHERE clause
我無法在MySQL中編寫以下查詢。 我有一個名為pizz0r_pizza_ingredients
的表,看起來像這樣:
| id | pizza_id | ingredient | amount | measure |
+----+----------+------------+--------+---------+
| 6 | 1 | 15 | 3 | 4 |
|178 | 17 | 1 | 160 | 1 |
| 3 | 1 | 20 | 3 | 4 |
我想搜索原料具有特定要求的比薩餅,例如:
SELECT `pizza_id`
FROM `pizz0r_pizza_ingredients`
WHERE `ingredient` = 15 AND `ingredient` != 20
GROUP BY `pizza_id`
我正在嘗試獲取ingredient
等於15的條目,但是如果它也具有成分20,則忽略了pizza_id。
當前結果為1
,但在此示例中,不返回任何內容。
嘗試這個:
SELECT P1.pizza_id
FROM pizz0r_pizza_ingredients P1
LEFT OUTER JOIN pizz0r_pizza_ingredients P2 ON P1.pizza_id = P2.pizza_id AND P2.ingredient IN (20, 21)
WHERE P1.ingredient = 15 AND P2.id IS NULL
GROUP bY P1.pizza_id;
我喜歡用處理這些問題group by
和having
:
SELECT `pizza_id`
FROM `pizz0r_pizza_ingredients`
GROUP BY `pizza_id`
HAVING SUM(ingredient = 15) > 0 AND
SUM(ingredient = 20) = 0;
您可以根據需要添加任意數量的新需求。 SUM()
表達式計算某種類型的成分的數量。 > 0
表示披薩上至少有一個。 = 0
表示不存在。
您需要結合兩組數據-可能需要的所有數據,然后排除與不需要的成分相交的數據,例如:
SELECT DISTINCT
wanted.pizza_id
FROM pizz0r_pizza_ingredients wanted
LEFT JOIN pizz0r_pizza_ingredients dontwant
ON wanted.pizza_id = dontwant.pizza_id
AND dontwant.ingredient IN ( 20, 21 )
WHERE wanted.ingredient IN ( 15 ) -- You could have multiples, if you wanted ham OR chicken, for example
AND dontwant.pizza_id IS NULL -- No bad ingredients
編輯:您的問題尚不清楚。 如果要排除成分為20的比薩餅,可以使用以下方法:
select pizzaid from pizz0r_pizza_ingredients where ingredient = 15
EXCEPT
select pizzaid from pizz0r_pizza_ingredients where ingredient != 20
注意: EXCEPT
通常比join
或not in
join
速度快
您必須選擇的一種方法是使用子查詢。 為了更好地理解這一點,我首先將兩個查詢分開,然后將它們組合在一起。
第一個將提取所有具有成分15的pizza_id
:
SELECT DISTINCT pizza_id
FROM myTable
WHERE ingredient = 15;
然后,您可以編寫另一個搜索披薩ID等於20的披薩ID:
SELECT DISTINCT pizza_id
FROM myTable
WHERE ingredient = 20;
最后,您可以使用NOT IN
子句將兩者結合起來。 換句話說,您可以選擇所有符合第一個條件的pizza_id,其中id不在符合第二個條件的pizza_id中:
SELECT DISTINCT pizza_id
FROM myTable
WHERE ingredient = 15 AND pizza_id NOT IN(
SELECT DISTINCT pizza_id
FROM myTable
WHERE ingredient = 20);
編輯
這是一個SQL Fiddle 。
編輯2
這是稱為關系划分的主題。 有類似於此另一個例子在這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.