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
相关产品推荐
相关产品推荐

