我有一个预订系统,我必须检查日期 或 日期范围是否不在保存的日期范围之间的MySQL。
这是我的表:
bookings(id, property_id, booked_from_date, booked_to_date)
每个酒店都可以预订一个或多个日期。
我查询是否某个日期或范围不在其中一个预订时段之间
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
我的逻辑是,如果某个日期不在预定范围之间,那么它可用,但查询不会返回正确的结果。
有没有办法排除这些日期之间可用的所有属性?
谢谢
修改
这是保存预订范围的表
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
这是父表
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
我的期望:
如果我搜索2016-05-30
,我希望退回除id 22
以外的所有船只,因为2016-05-30
的日期介于已预订的范围之间。
如果我从2016-06-05
搜索到2016-06-10
,我希望退回除id 25
以外的所有船只
希望这有帮助
答案 0 :(得分:3)
此查询将查找properties
中未预订的所有项目。主要想法是搜索预订的项目(并在JOIN bookings
)中放置条件。然后使用JOIN
将LEFT JOIN
转换为WHERE bookings.id IS NULL
- 它会将条件从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