SQL查询以查找酒店的免费房间

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-10endDate现在2016-03-25- 我已经预订了从2016-03-12到 的房间2016-03-22。我该如何解决?我不需要显示在我的日期之间预订的房间。

rea*_*iek 5

在范围 ($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 未找到现有预订)。