【发布时间】:2017-04-22 02:21:03
【问题描述】:
我正在构建一个酒店管理系统,但我一直在寻找指定日期的可用房间。我有两张桌子,即客房和预订
Rooms Table
| RoomID | Name | Floor | Bed | Rent | RoomType|
Reservation Table
| ResvID | RoomId | CheckIn | CheckOut | CustomerID |
预订表中的外键是RoomId。
我想要的只是获得可用的房间(在给定日期未预订)。我的应用程序还提供添加新房间的功能。所以仅仅加入预订表并没有给我想要的结果,因为新房间永远不会出现在预订表中。我还想使用 BedType 和 RoomType 进行过滤。我使用了以下查询
SELECT DISTINCT r.RoomID, r.RoomNo, r.Name, r.Floor, r.RoomType, r.Rent
FROM hms.rooms r
JOIN hms.reservation rv
ON r.RoomID = rv.ROOM_ID
WHERE (((rv.CHECKIN < ? AND --Checkin Provided
rv.CHECKOUT <= ?) OR --Checkin Provided
(rv.CHECKIN >= ? AND --Checkout Provided
rv.CHECKOUT > ?)) AND --Checkout Provided
rv.CHECKIN <> ? AND rv.CHECKOUT <> ?) AND -- Checkin/Checkoutprovided
(r.RoomType = ? AND --RoomType provided
r.Bed = ?) --BedType provided
UNION
SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent
FROM hms.rooms AS r WHERE r.RoomID NOT IN(
SELECT ROOM_ID FROM hms.reservation) AND
(r.RoomType = ? AND r.Bed = ?) --Room?BedType provided
而且这个查询不起作用。它总是显示房间。
编辑:尝试了此代码,但仍显示可用空间
SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent
FROM hms.rooms r
WHERE r.RoomID NOT IN
(SELECT ROOM_ID
FROM hms.reservation rv
WHERE(
((rv.CHECKIN <= ?) AND --in
(rv.CHECKOUT > ? AND rv.CHECKOUT < ?)) OR --in/out
((rv.CHECKIN < ? AND rv.CHECKIN > ?) AND --out/in
(rv.CHECKOUT >= ?)) OR --out
(rv.CHECKIN > ? AND rv.CHECKOUT < ?) OR --in/out
(rv.CHECKIN = ? AND rv.CHECKOUT = ?) OR --in/out
(rv.CHECKIN < ? AND rv.CHECKOUT > ?) --in/out
) AND
(r.RoomType = ? AND r.Bed = ?)
【问题讨论】: