我有两张这样的表
房间
id | number
1 | 111
2 | 112
occupied_rooms
id | check_in | check_out | room_id
1 | 2017-10-01 | 2017-10-04 | 1
我希望根据日期check_in和check_out获取所有未占用的房间,我试过了
select r.id
, r.number
from rooms r
left join occupied_rooms o
on r.id = o.room_id
where (o.check_in not between "2017-10-05" and "2017-10-08" )
or (o.check_in >= "2017-10-05" and o.check_out <= "2017-10-08"))
但是这个查询给了我这样的结果。这是不正确的。
id | number
1 | 111
此查询有什么问题? 感谢您的任何帮助和建议
答案 0 :(得分:1)
只要id
匹配并且预期停留范围与occupied_rooms
表中的范围重叠,就加入两个表。
SELECT r.*
FROM rooms r
LEFT JOIN occupied_rooms t
ON r.id = t.id AND
('2017-10-02' <= t.check_out AND '2017-10-03' >= t.check_in)
WHERE
t.id IS NULL; -- NULL value indicates the room did not overlap
-- with any existing reservations
您还可以查看此great reference question,了解如何处理SQL查询中的重叠范围。它使您面临的问题变得更加简单。
答案 1 :(得分:0)
表 occupied_rooms 中的数据符合“where”中的第一个条件;
check_in 日期(2017-10-01)不在“2017-10-05”和“2017-10-08”之间, >或强>
因此,结果包含在此数据中。
您能告诉我们您期望的输出吗?