我需要从hotel
数据库中选择所有免费房间,我想我可以通过两个步骤来完成:
bookings = select * from booking where booking.startDate>=selectedStartDate and booking.endDate=<selectedEndDate
。select * from room where room.room_id not includes bookings.room_id
。我写了第二个查询,就像伪查询一样,因为我无法找到自己能做的事情。如何检查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 |
+-----------+------------+------------+---------+---------+
答案 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