用于检查列是否包含某些数据的SQL查询

时间:2016-03-05 13:57:07

标签: mysql sql database select

我需要从hotel数据库中选择所有免费房间,我想我可以通过两个步骤来完成:

  1. bookings = select * from booking where booking.startDate>=selectedStartDate and booking.endDate=<selectedEndDate
  2. 伪查询:select * from room where room.room_id not includes bookings.room_id
  3. 我写了第二个查询,就像伪查询一样,因为我无法找到自己能做的事情。如何检查bookings是否包含room_id&#39;

    我的预订表格如下:

    +-----------+------------+------------+---------+---------+
    | bookingId | startDate  | endDate    | room_id | guestId |
    +-----------+------------+------------+---------+---------+
    |         1 | 2016-03-12 | 2016-03-22 |       1 |       1 |
    |         2 | 2016-03-12 | 2016-03-22 |       2 |       2 |
    +-----------+------------+------------+---------+---------+
    

3 个答案:

答案 0 :(得分:2)

您可以使用not in运算符将第一个查询转换为第二个查询的子查询:

SELECT *
FROM   room
WHERE  room.room_id NOT IN (SELECT room_id
                            FROM   booking
                            WHERE  startDate >= selectedEndDate AND
                                   endDate <= selectedStartDate)

答案 1 :(得分:2)

如果您希望在一段时间内免费房间,请使用not exists。正确的逻辑是:

select r.*
from room r
where not exists (select 1
                  from booking b
                  where $startdate <= b.enddate and $enddate >= b.startdate
                 );

当一个在第二个结束之前开始而第一个在第二个结束之后结束时,两个周期重叠。

请注意<=>=可能是严格的不等式,具体取决于期间是否包含第一个和最后一个日期。

答案 2 :(得分:0)

您可以使用更优化的查询

SELECT * FROM room JOIN booking ON room.room_id = booking.room_id
WHERE booking.startDate >= selectedStartDate AND booking.endDate <= selectedEndDate