2011-06-20 115 views
0

有可能或不可以保留的房間。預訂日期從(日期)至(日期)。人按日期搜索房間:from_field和till_field。試圖找到一個房間是否可用。MySQL查詢問題:像系統預訂

SELECT rooms.* FROM rooms 
LEFT JOIN reservations ON reservations.room_id = rooms.id 
WHERE (reservations.from > till_field OR reservations.till < from_field) 

問題:如果單個保留成功,那麼即使另一個保留佔用了該位置,似乎該查詢仍有可用空間。

+0

是什麼問題? –

+0

LEFT JOIN導致問題,當沒有任何保留時它不會返回房間。 – John

回答

3

如何檢索配有沒有resevations可言:

如果沒有預訂,將有查詢返回的沒有reservations排=>您必須檢查也(reservations.room_id IS NULL ):

SELECT rooms.* FROM rooms 
LEFT JOIN reservations ON reservations.room_id = rooms.id 
WHERE reservations.room_id IS NULL -- if there is no reservations 
     OR reservations.from > till_field 
     OR reservations.till < from_field 

但真正得到想要的東西歐,你必須檢查的房間沒有任何保留有:

  • fromDate or tillDate between from_field and till_field
  • OR

  • fromDate < from_field and tillDate > till_field

SELECT rooms.* 
    FROM rooms 
WHERE NOT EXISTS (SELECT NULL 
        FROM reservations 
        WHERE reservations.room_id = rooms.id 
        AND ((
          reservations.from BETWEEN from_field AND till_field 
          OR 
          reservations.till BETWEEN from_field AND till_field 
         ) 
         OR 
         (
          reservations.from < from_field 
          AND reservations.till > till_field 
         ) 
         ) 
       ) 
+0

問題...如果單個預留成功,則查詢說房間可用。有沒有辦法讓所有左側加入的預訂都能成功進入房間? – John

+1

我用一個更容易理解的解決方案編輯我的答案。 – manji

+0

謝謝,還沒有得到它的工作。真正的查詢要複雜得多,但這會對一堆幫助很大。 – John