我正在尝试学习如何正确使用 NOT EXISTS
及其背后的逻辑。我有这个查询:
Bars which every drinker frequents
连同这个频率
表:
只看表,我知道 Blue Angel
应该是结果。我从这样的事情开始(这没有给我我想要的):
SELECT f.bar
FROM frequents f
WHERE NOT EXISTS(
SELECT ff.drinker
FROM frequents ff
WHERE f.drinker <> ff.drinker
AND f.bar = ff.bar
);
因此,如果 f.bar
是“A.P. Stump's”,我必须检查表中的每个其他名称是否也经常出现“A.P. Stump's”。我似乎不知道该怎么做。
我需要做什么?请注意,我必须在查询中使用 NOT EXISTS
。
最佳答案
我会使用 group by
和 having
来做到这一点:
select bar
from frequents b
group by bar
having count(*) = (select count(distinct drinker) from frequents);
此查询仅计算每个酒吧中饮酒者的数量。如果计数与饮酒者总数相匹配,则“酒吧”通过并在结果集中。
这假设 frequents
表没有关于 bar
/drinker
的重复行。如果是这样,请使用 count(distinct drinker)
而不是 count(*)
。
虽然这可以表述为一个NOT EXISTS
查询(实际上,两个NOT EXISTS
将在查询中),但我发现实际上这样做没有用.如果您正在学习 SQL,嵌套的 NOT EXISTS
是一个有趣的思维练习。聚合更加灵活,可以回答更广泛的问题(例如,大多数饮酒者经常光顾多少家酒吧)。
关于mysql - SQL:每个饮酒者经常光顾的酒吧(使用 NOT EXISTS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681802/