You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:20