2011-06-07 108 views
3

比方說,我有一個hotel_rooms表,每個表都有一些關聯的預訂記錄。如何有效地找到不與日期間隔重疊的所有記錄?

的表是這樣的:

hotel_rooms:

 
hotel_room_id | hotel_name 
-------------------------- 
1    | Hotel A 
2    | Hotel B 
3    | Hotel C 

預訂:

 
reservation_id | hotel_room_id | start_date | end_date 
------------------------------------------------------------ 
1    | 1    | 1 June 2011 | 10 June 2011 
2    | 1    | 20 June 2011 | 30 June 2011 
3    | 2    | 11 June 2011 | 15 June 2011 
4    | 3    | 1 June 2011 | 4 June 2011 



我怎樣可以找到所有的酒店帶有checkin_date和checkout_date的_rooms與任何hotel_rooms的預訂都不會重疊?例如,如果checkin_date是2011年6月4日,checkout_date是2011年6月8日,那麼Hotel A和Hotel C將不會顯示在結果中,只有Hotel B.如果checkin_date是2011年6月16日,並且checkout_date是2011年6月19日,所有三家酒店都會出現。

我確信有幾種方法可以解決這個問題,但是對於我們的情況,假設hotel_rooms中有很多記錄,並且每個房間都與許多保留記錄相關聯。什麼是處理此搜索的有效方法?

對於我的目的,我使用MySQL和PHP(但我不一定需要解決方案)。

+0

你的功課?你爲什麼要重新做hotels.com? – Nik 2011-06-07 04:04:36

+0

不是功課。這是我正在建設的一個網站,實際上並不適用於酒店。在這種情況下,酒店似乎是最明顯的例子。 – jameslk 2011-06-07 04:08:40

+0

我在熱切地等待OMG Ponies(又名SQL King)對這一個的迴應 – Jason 2011-06-07 04:12:40

回答

3
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 
) 
0

我認爲幾個NOT EXISTS子查詢可以爲你工作。假設表格已正確編制索引,時機也不應該成爲問題。

SELECT * 
FROM hotel_rooms 
WHERE NOT EXISTS (SELECT 1 FROM reservations 
        WHERE reservations.hotel_room_id = hotel_rooms.hotel_room_id 
        AND checkin_date BETWEEN start_date AND end_date) 
AND NOT EXISTS (SELECT 1 FROM reservations 
       WHERE reservations.hotel_room_id = hotel_rooms.hotel_room_id 
       AND checkout_date BETWEEN start_date AND end_date) 
+1

我想你錯過了checkin_date單個預訂的 start_date' – Howard 2011-06-07 04:18:26

相關問題