2013-11-27 148 views
0

我對酒店預訂系統有點麻煩。我無法確定哪些房間在哪個日期可用。我會在這裏簡化表格,這樣你就可以得到我想要做的事情。SQL酒店預訂系統

Table 1 (ROOMS) : 
RoomID, 
RoomType (Single, Double etc) 

Table 2 (BOOKINGS) 
BookingID, 
RoomID, 
Available (Yes/No), 
CheckInDate, 
CheckOutDate, 
RoomType 

我試圖搜索BOOKINGS表可用room(ID)取決於checkin, checkout and roomtype。顯然,我無法搜索它,因爲此刻沒有任何內容,即使有,也會列出所有不可用的房間(當前預訂),所以我認爲我可以比較ROOMS表和BOOKINGS這樣的桌子,並試圖通過這種方式獲得一個空房間(ID)。

SELECT RoomID FROM ROOMS 
WHERE RoomType = 'Single' AND NOT EXISTS 
(SELECT RoomID FROM BOOKINGS WHERE CheckOut >= '2013-12-02' 
AND CheckIn <= '2013-12-07') 
AND RoomType = 'Single' 
AND Available = 'Yes') 

這將返回ROOMS表中的所有單個房間。

示例:預訂2013-12-01之前的單間(1號),直到2013-12-08。如果我在2013-12-07之前嘗試使用2013-12-02的當前邏輯進行預訂,則返回第1號房間可用。任何人都有想法如何做到這一點?儘可能簡單。

我在這裏使用了一個簡化的命名約定,以使它更具可讀性。

+1

你爲什麼要保持RoomType兩個表中?看起來像純粹屬於房間關係的東西,與預訂無關。 – Tobberoth

+0

因爲我必須根據RoomType和簽入/日期篩選結果來查找可用房間。 – user3041664

+0

爲什麼?你已經有RoomID,爲什麼你需要過濾RoomType? – Tobberoth

回答

0

您需要關聯您的子查詢。 目前沒有什麼將EXISTS子查詢與ROOMS上的外部查詢關聯起來。 因此,您將獲得所有單人房間或NONE,具體取決於獨立運行時EXISTS是true還是false。

像這樣的東西應該工作:

SELECT RoomID FROM ROOMS R 
WHERE RoomType = 'Single' AND NOT EXISTS 
(SELECT * FROM BOOKINGS 
WHERE RoomID = R.RoomID 
    AND CheckOutDate >= '2013-02-02' 
    AND CheckInDate <= '2013-02-07' 
) 

我在這裏做了一個SQLFiddle例如:http://sqlfiddle.com/#!2/b0ff3/6

+0

當然,這樣做很快就是爲什麼酒店系統不會非常便宜的原因:) – Luaan