2017-01-28 84 views
1

我目前正在致力於酒店預訂服務,並且我想在特定時間段內顯示特定房型和酒店的所有免費房間。 我發現什麼似乎是一個工作查詢,直到我注意到:如果一個房間沒有任何保留,它不起作用。SQL在特定時間段內查找免費房間

SELECT DISTINCT r.id, 
      r.num, 
      r.NAME, 
      h.NAME, 
      h.city, 
      h.country 
FROM room r 
    JOIN hotel h 
    ON r.hotel_id = h.id 
    JOIN room_type rt 
    ON r.room_type_id = rt.id 
WHERE r.id NOT IN (SELECT room_id 
        FROM reservation 
        WHERE ('$from' BETWEEN start_date AND end_date) 
         OR (start_date BETWEEN '$from' AND '$to') 
         OR '$from' = start_date) 
    AND $roomtype = rt.id 
    AND $hotel = h.id 

這個查詢將在PHP腳本中使用,其中「從$」是用戶選擇的預訂日期開始至$的就是預約的結束等

有沒有一種方法,使這項查詢即使房間沒有保留也可以工作嗎? 任何幫助,非常感謝!

回答

0

邏輯用於無未室是:

  • 預訂上或問題結束時段之前開始。
  • 預訂在問題開始時或之後結束。

一個不是沒有免費的房間可用。讓我們將這個邏輯應用到您的查詢:

SELECT r.id, r.num, r.name, h.name, h.city, h.country 
FROM room r JOIN 
    hotel h 
    ON r.hotel_id = h.id JOIN 
    room_type rt 
    ON r.room_type_id = rt.id 
WHERE rt.id = $roomtype AND 
     h.id = $hotel AND 
     r.id NOT IN (SELECT res.room_id 
        FROM reservation res 
        WHERE '$to' <= end_date AND 
         '$from' >= start_date AND 
       ); 

注意:你應該在你的查詢中使用參數值,而不是改寫(munging)查詢字符串。

+0

非常感謝您的回覆。我應用了你的邏輯,現在它終於正常工作了!在子查詢之前檢查rt.id和r.id也很有意義。謝謝 :) – heap1

相關問題