我有一个带有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;
这给了我所有项目,没有像我期望的那样正确匹配日期。
我可以在服务器端代码中执行此操作,例如:
选择日期=&gt;之间的所有
db.the_date
循环结果中的所有行并过滤掉匹配。
但我想在MySQL中得到它。有关查询如何的任何建议?
答案 0 :(得分:1)
您需要检查NULL
中db
的值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
答案 1 :(得分:1)
选择首先在日期之间预订的所有项目,然后将其粘贴到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
可能会或可能不会加快执行速度。