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