mysql - 不显示其中一个条目具有不需要的值的名称

标签 mysql

例如有这样一个表“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 条件返回 01。标准 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/

相关文章:

MySQL 社区 - 扩展

php - 更改 mysql.sock

mysql - mysql中的案例根据条件执行另一个查询

MySQL:选择多行但限制为 1

php - 我如何使用 MySQL 和整个 LAMP 处理每天 5M 事务?

mysql - 为什么使用游标的MySQL触发器只获取一个值

mysql - JOIN 查询中的条件放在哪里?

mysql - 选择以特定字母开头的所有记录

mysql - MySQL 每部电影的平均类型数

Mysql - 在同一个表中为另一个查询划分 1 个查询