2013-11-27 107 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