假设我有一张酒店房间表,每个房间都有一些相关的预订记录。
这些桌子看起来是这样的:
酒店房间:
酒店名称
—————————————————————————
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
  )

07-24 09:51
查看更多