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

PHP与MySQL:基于第二列日期筛选未被占用的酒店房间

查询指定日期未被占用的酒店房间

嘿,我来帮你搞定这个房间查询的问题!首先得提一句:你提到了第二个表但没给出结构,我默认这是记录房间预订信息的BOOKINGS表,通常包含IDROOM(关联ROOMS表的IDROOM主键)、CHECK_IN(入住日期)和CHECK_OUT(退房日期)字段。如果你的实际表结构有差异,直接调整字段名就行。

情况1:查询2018-05-18和2018-05-19两天都未被占用的房间

这类房间是完全空出来的,两天都可以预订。我们可以用左连接来筛选没有任何重叠预订的房间:

SELECT r.IDROOM, r.TITLE, r.CATEGORY
FROM ROOMS r
LEFT JOIN BOOKINGS b 
    ON r.IDROOM = b.IDROOM
    -- 筛选出与目标日期区间有重叠的预订
    AND NOT (b.CHECK_OUT <= '2018-05-18' OR b.CHECK_IN >= '2018-05-20')
-- 没有匹配到重叠预订的房间,就是两天都可用的
WHERE b.IDROOM IS NULL;

这里的逻辑是:NOT (b.CHECK_OUT <= '2018-05-18' OR b.CHECK_IN >= '2018-05-20')会找出所有和2018-05-18至2018-05-19有时间重叠的预订。左连接后,那些没有匹配到任何这类预订的房间,自然就是这两天都没被占用的。

情况2:查询至少在2018-05-18或2018-05-19其中一天未被占用的房间

如果只要两天中有一天空着就算符合条件,我们可以先找出那些两天都被完全占用的房间,再把它们从ROOMS表中排除:

SELECT IDROOM, TITLE, CATEGORY
FROM ROOMS
WHERE IDROOM NOT IN (
    SELECT DISTINCT b.IDROOM
    FROM BOOKINGS b
    -- 筛选出完全覆盖两天的预订(即这两天都被占用)
    WHERE b.CHECK_IN <= '2018-05-18' AND b.CHECK_OUT >= '2018-05-19'
);

子查询里的逻辑是找出那些入住日期早于等于5月18日、退房日期晚于等于5月19日的房间——这类房间在两天里都被占用了。外层查询排除这些房间,剩下的就是至少有一天可用的房间。

如果你的预订表结构不是入住/退房区间(比如用单个日期字段记录每天的占用情况),可以告诉我具体结构,我再帮你调整SQL语句~

内容的提问来源于stack exchange,提问作者Milhouse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:33:44