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

  • 本文关键字:日期 比较 DB 选择 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;

这给了我所有的项目,没有像我期望的那样正确匹配日期。

我可以在服务器端代码中这样做,比如:

选择日期之间的所有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

最新更新