假设我有一张酒店房间表,每个房间都有一些相关的预订记录。
这些桌子看起来是这样的:
酒店房间:
酒店名称
—————————————————————————
1 A酒店
2 B酒店
3 C酒店
预订:
预订酒店房间ID开始日期结束日期
————————————————————————————————————————————————————
2011年6月1日-2011年6月10日
2011年6月20日-2011年6月30日
2011年6月11日-2011年6月15日
2011年6月4日-3日-1日-2011年6月4日
如何找到所有签入日期和签出日期与酒店预订不重叠的酒店房间?
例如,如果签入日期是2011年6月4日,签出日期是2011年6月8日,则酒店A和酒店C不会显示在结果中,只有酒店B。如果签入日期是2011年6月16日,签出日期是2011年6月19日,则三家酒店都会显示。
我确信有几种方法可以解决这个问题,但是对于我们的情况,假设酒店房间中有很多记录,每个房间都有许多预订记录。什么是处理这个搜索的有效方法?
出于我的目的,我使用的是mysql和php(但我也不一定需要一个解决方案)。
最佳答案
SELECT h.*
FROM hotel_rooms h
LEFT JOIN reservations r
ON h.hotel_room_id = r.hotel_room_id
AND checkin_date <= r.end_date
AND checkout_date >= r.start_date
WHERE r.reservation_id IS NULL
或:
SELECT *
FROM hotel_rooms h
WHERE NOT EXISTS (
SELECT *
FROM reservations r
WHERE h.hotel_room_id = r.hotel_room_id
AND checkin_date <= r.end_date
AND checkout_date >= r.start_date
)