MySQL离开了连接的条件

时间:2017-11-03 06:19:09

标签: mysql left-join

我有两张这样的表

房间

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

此查询有什么问题? 感谢您的任何帮助和建议

2 个答案:

答案 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查询中的重叠范围。它使您面临的问题变得更加简单。

Demo

答案 1 :(得分:0)

occupied_rooms 中的数据符合“where”中的第一个条件;

check_in 日期(2017-10-01)不在“2017-10-05”和“2017-10-08”之间, >或

因此,结果包含在此数据中。

您能告诉我们您期望的输出吗?