MySQL: NOT BETWEEN 未按预期运行

MySQL: NOT BETWEEN not behaving as expected

我有一个预订系统,我必须检查日期 日期范围 不在 MySQL.

中保存的日期范围之间

这是我的 table:

bookings(id, property_id, booked_from_date, booked_to_date)

每个属性可以预订一个或多个日期none。

我要检查某个日期或范围是否不在预订期间之一之间的查询是

SELECT p.id, p.title
FROM properties p 
LEFT JOIN bookings b ON p.id = b.property_id 
WHERE 
    COALESCE('selected_from_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE) AND 
    COALESCE('selected_to_date' NOT BETWEEN p.booked_from_date AND b.booked_to_date , TRUE)
GROUP BY main.id

我的逻辑是,如果某个日期不在预定范围内,那么它是可用的,但查询没有 return 正确的结果。

是否有任何方法可以排除在这些日期之间可用的所有属性?

谢谢

编辑

这里是 table,其中包含预订的范围

id boat_id booking_id booked_from_date booked_to_date
 5      22 NULL       2016-05-28       2016-06-04
 6      22 NULL       2016-07-02       2016-07-09
 7      22 NULL       2016-07-16       2016-07-23
 9      25 NULL       2016-06-04       2016-06-11

这是父table

 id title
 21 Vacanza tra comfort e benessere su barca a vela ad...
 22 Vacanza in Barca a Vela su Gib Sea 372
 23 Vacanza da sogno su un Motor Yacht
 24 Capri & Costiera Amalfitana
 25 Golfo di Napoli in barca a vela
 26 Il 44 piedi che sorprende

我的期望:

希望这对您有所帮助

此查询将从 properties 中查找所有未预订的项目。主要思想是搜索预订的项目(并将其放置在 JOIN bookings 中)。然后使用 WHERE bookings.id IS NULLJOIN 转换为 LEFT JOIN - 它会将条件从 booked 反转为 not booked

SELECT p.id, p.title
FROM properties p 
LEFT JOIN bookings b ON p.id = b.property_id
  AND b.booked_from_date <= 'selected_to_date'
  AND b.booked_to_date >= 'selected_from_date'
WHERE b.id IS NULL