rel*_*l1x 1 mysql sql database select
我使用查询从hotelDB 中查找空闲房间。我写了一个查询来选择不在booking表格中的房间:
SELECT * FROM room WHERE roomId NOT IN
(SELECT roomId FROM booking b WHERE STR_TO_DATE('${endDate}', '%m-%d-%Y') <= b.endDate AND
STR_TO_DATE('${startDate}', '%m-%d-%Y') >= b.startDate);
Run Code Online (Sandbox Code Playgroud)
我的booking桌子看起来像:
+-----------+------------+------------+--------+---------+
| bookingId | startDate | endDate | roomId | guestId |
+-----------+------------+------------+--------+---------+
| 1 | 2016-03-12 | 2016-03-22 | 1 | 1 |
+-----------+------------+------------+--------+---------+
Run Code Online (Sandbox Code Playgroud)
但如果我startDate现在2016-03-10和endDate现在2016-03-25- 我已经预订了从2016-03-12到 的房间2016-03-22。我该如何解决?我不需要显示在我的日期之间预订的房间。
在范围 ($BOOKING_BEGIN <=> $BOOKING_END) 内寻找空闲房间问题的一般方法如下:
SELECT
rooms.room_id
FROM
rooms
LEFT JOIN
bookings
ON (
bookings.room_id = rooms.room_id AND
NOT (
(bookings.begin < $BOOKING_BEGIN and bookings.end < $BOOKING_BEGIN)
OR
(bookings.begin > $BOOKING_END and bookings.end > $BOOKING_END)
)
)
WHERE
bookings.room_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
这只是意味着“把酒店的所有房间都拿去,把它们和已经预订好的房间一起。” 如果为空,则表示给定范围内的房间是免费的(Join 未找到现有预订)。