选择比较DB中的日期和预订

时间:2016-04-01 20:05:07

标签: mysql

我有一个带有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中得到它。有关查询如何的任何建议?

2 个答案:

答案 0 :(得分:1)

您需要检查NULLdb的值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可能会或可能不会加快执行速度。