2013-05-14 86 views
1

我在寫入sql以從表中獲取可用房間時遇到問題。房間預訂查詢

我的表格結構如下。

Table Booking 
ID | START_DATE | END_DATE 


Table BookingRoom (Intermediate Table) 
ID | BOOKING_ID |ROOM_ID 

的房間可以鏈接到許多預訂和預約可以包含許多房間

Table Room 
Contains the ID room 

我都試過,但有是,如果一個房間被鏈接到不同的日期2個型動物預訂一probleme該comparaison將僅在第一個預約ID來maked

SELECT DISTINCT r.ID FROM room AS r ,booking AS b,bookingroom AS br 
WHERE r.ID = br.ID_ROOM 
AND b.ID = br.ID_BOOKING 
AND (
      b.END_DATE < '05/14/2013' 
     OR b.START_DATE > '05/15/2013' 
    ) 

有人可以幫我寫的SQL拿到之間的可用客房簽入和結帳日期。

+0

您是否在尋找特定日期/時間或期間的房間? –

+0

實際上,我正在搜索入住日期和結帳日期之間的可用房間 – Safwen

回答

2

如果你想要的是房間可供所需日期的整個範圍列表,然後像下面這樣可能工作:

Select Room.Id 
From Room 
Where Room.Id Not In (
         Select RoomId 
         From BookingRoom 
          Join Booking 
           On Booking.Id = BookingRoom.BookingId 
         Where Booking.StartDate <= 'DesiredEndDate' 
          And Booking.EndDate >= 'DesiredStartDate' 
         ) 
Order By Room.Id 

因此,使用原來的例子,我們可能得到:

Select Room.Id 
From Room 
Where Room.Id Not In (
         Select RoomId 
         From BookingRoom 
          Join Booking 
           On Booking.Id = BookingRoom.BookingId 
         Where Booking.StartDate <= '2013-05-15' 
          And Booking.EndDate >= '2013-05-14' 
         ) 
Order By Room.Id 
0

您需要爲「第X天所有預訂」定義明確的記錄集,然後使用外部聯接來檢索那些沒有預訂的房間。

SET @myDate = #someDay# 
SELECT R.ID 
FROM Room R 
WHERE R.ID NOT IN (
    SELECT BR.ROOM_ID 
    FROM BookingRoom BR 
    INNER JOIN Booking B ON BR.Booking_ID = B.ID 
    WHERE @myDate BETWEEN B.start_date and B.end_date 
) 

編輯:

既然你預約時需要所有開房,你需要做一個更復雜的查詢。我假設你已經有外部加載的日期,因爲做一個基於日期的多對多查詢是一個PITA。

SET @dateStart = #Start# 
SET @dateEnd = #End# 

SELECT R.ID 
FROM Room R 
WHERE R.ID NOT IN (
    SELECT BR.ROOM_ID 
    FROM BookingRoom BR 
    INNER JOIN Booking B ON BR.Booking_ID = B.ID 
    WHERE B.start_date BETWEEN @dateStart AND @dateEnd 
    AND B.end_date BETWEEN @dateStart AND @dateEnd 
) 
+0

他正在尋找日期範圍而非特定日期... –