我正在建立一个酒店管理系统,我被困在找到指定日期的可用房间。我有两个表,即房间和预订
Rooms Table
| RoomID | Name | Floor | Bed | Rent | RoomType|
Reservation Table
| ResvID | RoomId | CheckIn | CheckOut | CustomerID |
预订表中的外键是RoomId。
我想要的就是获得可用的房间(在指定日期没有预订)。我的应用程序还提供添加新房间的功能。所以只是加入Reservation表并没有给我想要的结果,因为新的房间永远不会在预订表中。我还想过滤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 = ?)
答案 0 :(得分:0)
请提供一些示例数据并指出失败的原因以及预期结果应该是什么。如果我理解正确,您正试图找到一个在指定的签到结账范围内不会保留的房间。也许是这样的:
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 < :p_checkout
AND rv.CHECKOUT > :p_checkin
)
AND r.RoomType = :p_room_type AND r.Bed = :p_bed_type
即。如果在我的结帐(:p_checkout
)之前有预订并且在我的签到(:p_checkin
)之前没有完成预订,则从可用房间列表中排除预留的房间。