例如有这样一个表“Eaten_food”:
Name Food
--------------------
Lisa Grapes
Victoria Broccoli
Oliver Carrot
Lisa Apple
Kayla Pineapple
Oliver Banana
Victoria Kiwi
Kayla Grapes
我想做一个查询,只显示不吃葡萄的名字。
例如,Kayla 和 Lisa 吃了葡萄,所以她们不应该出现在结果列表中。
SELECT Name FROM Eaten_food WHERE NOT Food = "Grapes" GROUP BY Name
该查询不起作用。在这种情况下什么查询应该是正确的?
最佳答案
SELECT Name
FROM Eaten_food
GROUP BY Name
HAVING BIT_OR(Food = "Grapes") = 0
还有许多其他方法可以编写 HAVING 子句。其中一些是:
HAVING BIT_AND(Food <> "Grapes")
HAVING SUM(Food = "Grapes") = 0
HAVING MAX(Food = "Grapes") = 0
他们都会检查给定组(Name
)的Food
列中的值绝不是“Grapes”。
上述条件适用于 MySQL,因为 bool 条件返回 0
或 1
。标准 SQL 条件可能是:
HAVING MAX(CASE Food WHEN 'Grapes' THEN 1 ELSE 0 END) = 0
并且应该适用于任何主要的 RDBMS。
如果您的表(例如 people
)具有不同的名称,则可以使用 NOT EXISTS 子查询条件:
SELECT p.Name
FROM people p
WHERE NOT EXISTS (
SELECT *
FROM Eaten_food f
WHERE f.Name = p.Name
AND f.Food = 'Grapes'
)
根据数据,这可能会更快,因为不需要完全读取 Eaten_food
。
等效查询是:
SELECT p.Name
FROM people p
LEFT JOIN Eaten_food f
ON f.Name = p.Name
AND f.Food = 'Grapes'
WHERE f.Name is NULL
所有查询都将受益于(名称,食物)
上的复合索引。
关于mysql - 不显示其中一个条目具有不需要的值的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090562/