如何用MySQL查询在伦敦所有酒店都有预订的客人?
解决思路与SQL语句
嘿,我懂你要搞定的需求——找出那些在伦敦的每一家酒店都有预订记录的客人对吧?之前用视图+WHERE IN ALL没得到满意结果,大概率是因为IN ALL的逻辑和咱们的需求不匹配,咱们换两种更靠谱的思路来实现:
方法1:分组统计匹配法
核心逻辑是:如果一个客人预订过的伦敦酒店数量,等于伦敦酒店的总数量,那他就满足条件(注意要去重,避免同一酒店多次预订导致统计数虚高)。
对应的SQL语句:
SELECT g.guest#, g.guest_name FROM guest g JOIN booking b ON g.guest# = b.guest# JOIN hotel h ON b.hotel# = h.hotel# WHERE h.city = '伦敦' GROUP BY g.guest#, g.guest_name HAVING COUNT(DISTINCT h.hotel#) = ( -- 子查询获取伦敦酒店的总数量 SELECT COUNT(*) FROM hotel WHERE city = '伦敦' );
方法2:NOT EXISTS反证法
换个角度想:不存在任何一家伦敦酒店是这个客人没预订过的,那这个客人就符合要求。这种写法不需要分组,逻辑更直观:
SELECT g.guest#, g.guest_name FROM guest g WHERE NOT EXISTS ( -- 查找「伦敦的酒店中,当前客人没有预订过的」 SELECT 1 FROM hotel h WHERE h.city = '伦敦' AND NOT EXISTS ( -- 确认当前客人是否预订过这家酒店 SELECT 1 FROM booking b WHERE b.hotel# = h.hotel# AND b.guest# = g.guest# ) );
为啥之前的WHERE IN ALL没生效?
简单说,WHERE hotel# IN ALL (...)的逻辑是:要求当前行的hotel#等于子查询返回的每一个值,这显然不可能——一条booking记录只能对应一家酒店,所以这个逻辑从根本上就不符合咱们的需求,自然得不到正确结果。
内容的提问来源于stack exchange,提问作者AlAzif
相关产品推荐
相关产品推荐

