2016-09-25 102 views
0

我試圖根據用戶給出的日期範圍獲得無保留的酒店房間。選擇兩個日期範圍之間的特定記錄

我有兩個表

  • 客房的列ROOM_ID,roomno
  • 保留與列reserv_id,ROOM_ID,checkindate,checkoutdate

即時通訊應用該查詢

$sql = "SELECT DISTINCT roomno 
FROM rooms 
LEFT JOIN reservation ON rooms.room_id = reservation.room_id 
AND 
(
    (
     (reservation.checkindate > '$newreservcheckin') 
     AND 
     (reservation.checkindate > '$newreservcheckout') 
    ) 
    OR 
    (
     (reservation.checkoutdate < '$newreservcheckin') 
     AND 
     (reservation.checkoutdate < '$newreservcheckout') 
    ) 
)"; 

$ newreservcheckin$ newreservcheckout的日期範圍由用戶

提供比方說,我們有roomno爲100和101 現在100從2016年9月16日登記到2016年9月18日 房並且100也預訂從9-27-2016到9-29-2016 並且房間101未預留(意味着它在預訂表中沒有記錄)

假設如果用戶給出日期9-26-2016到9- 30-2016查詢將忽略從9-27-2016到9-29-2016的房間no 100項,但會顯示房間no 100,日期從9-16-2016到2016年9月18日a nd會顯示101個房間

如何模塑查詢,以便它可能不會給同一個房間,但具有不同日期的房間?

回答

0

您需要選擇的客房,或者是(A)沒有預訂或(B)預訂,但該範圍之外,你要查詢,下面的查詢應該工作:

select no from room r 
where not exists (
    select id from reservation where room_id = r.id) 

union 

select no from room r 
where r.id not in (
    select distinct room_id from reservation 
    where 
     checkindate between '2016-09-20' and '2016-09-22' 
    OR 
     checkoutdate between '2016-09-20' and '2016-09-22' 
) 

這裏是SQL Fiddle

0

您可以加入與新的檢查日期重疊的每個預訂,並選擇那些沒有任何加入的房間。在我的查詢中,我希望新客人可以在前一次結帳時在同一日期簽入。如果不是,則將「<」更改爲「< =」,將「>」更改爲「> =」。

SELECT 
    r.roomno 
FROM 
    rooms r 
     LEFT JOIN 
    reservations res ON res.room_id = r.room_id 
     AND res.checkindate < '$newreservcheckout' 
     AND res.checkoutdate > '$newreservcheckin' 
WHERE res.reserv_id IS NULL