簡體   English   中英

WHERE子句中的多行條件

[英]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 byhaving

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通常比joinnot 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM