我有一个包含items
表和bookings
表的数据库。bookings
有一个条目/行,用于预订项目的每一天。
我需要检查哪些项目没有在特定的日期间隔内预订。
我正在尝试用MySQL获得它,我尝试了
SELECT * FROM items AS i
LEFT JOIN day_bookings AS db ON i.id = db.id_item
WHERE i.state <> 0
AND db.the_date NOT BETWEEN DATE('2016-02-01') AND DATE('2016-04-10')
GROUP BY i.id;
这给了我所有的项目,没有像我期望的那样正确匹配日期。
我可以在服务器端代码中这样做,比如:
选择日期之间的所有
db.the_date
=>循环结果中的所有行并过滤掉匹配项。
但我想把它放在MySQL中。关于如何进行查询,有什么建议吗?
首先选择日期之间预订的所有项目,然后将其粘贴到NOT IN子查询中:
SELECT * FROM items WHERE id_item NOT IN
(SELECT id_item FROM day_bookings
WHERE the_date BETWEEN DATE('2016-02-01') AND DATE('2016-04-10'))
根据表的大小,在嵌套查询中使用SELECT DISTINCT
可能会加快执行速度,也可能不会。
您需要在db
中检查NULL
值,其中the_date
在该范围内-如果该项不存在于左联接的右侧,则其列都将为NULL
。
您还需要将日期检查移动到联接条件中,而不是WHERE子句中才能使其工作。
SELECT * FROM items AS i
-- get bookings for the item between the required dates
LEFT JOIN day_bookings AS db ON i.id = db.id_item
AND db.the_date BETWEEN DATE('2016-02-01') AND DATE('2016-04-10')
WHERE i.state <> 0
AND db.id_item IS NULL -- only include if the booking does NOT exist