Mysql 联接表中两个日期之间不存在记录的情况

Mysql 联接表中两个日期之间不存在记录的情况,mysql,sql,Mysql,Sql,我正在尝试选择我们所有在过去两个月内没有售出的商品 我正在尝试使用此查询,但它无法按预期工作: SELECT SalesDescription FROM Items I LEFT JOIN Orders_Items OI ON OI.ItemID=I.ItemID LEFT JOIN Orders O ON O.OrderID=OI.OrderID WHERE OrderTime NOT BETWEEN date_sub(curdate(), interval 2 month) AND d

我正在尝试选择我们所有在过去两个月内没有售出的商品

我正在尝试使用此查询,但它无法按预期工作:

SELECT SalesDescription FROM Items I
LEFT JOIN Orders_Items OI
ON OI.ItemID=I.ItemID

LEFT JOIN Orders O
 ON O.OrderID=OI.OrderID

WHERE OrderTime NOT BETWEEN date_sub(curdate(), interval 2 month)
AND date_sub(curdate(), interval 1 day)
Group By I.ItemID
基本上,我想从Items表(按item id分组)中获取所有记录,如果且仅当它们在过去两个月内没有被订购

当我执行上面的连接时,生成的表类似于:

Name        OrderID     OrderDate
Widget A     1          Last Year    
Widget B     2          Last Week
Widget C     3          Last Year
Widget C     4          Last Week
我的结果应该只返回小部件A,因为它在过去2个月内没有订购。一年多前订购的事实与此无关

小部件C不应出现,因为包含小部件C的订单是在过去2个月内下的

问题是,我想要的记录没有与之关联的日期范围。另一种说法是:

我想从items表中的所有项目开始,然后排除附加订单的项目,这些附加订单中至少有一个是在2个月范围内下的


我怎样才能做到这一点呢?

就我个人而言,我认为这是你问题的最清晰表达:

 SELECT SalesDescription FROM Items I
     WHERE NOT EXISTS (SELECT * FROM Orders O 
                       WHERE O.ItemID = I.ItemID AND O.OrderTime BETWEEN X AND Y)
(其中X和Y为相关日期)

您也可以这样写:

 SELECT SalesDescription FROM Items 
     WHERE ItemID NOT IN 
           (SELECT ItemID FROM Orders O WHERE O.OrderTime BETWEEN X AND Y)
任何一个版本都应该“足够快”超过几千项,以便偶尔使用。如果您的item表要大得多,或者您需要在某种在线事务(而不是报告)期间执行此查询,则有其他方法可以编写它。您甚至可以通过连接来完成,但是您只需要连接订单一次,而不是两次


(注意:您的请求中对问题有两种不同的定义。首先,您要求的是过去两个月内未售出的所有商品。然后,在摘要中,您要求的是至少售出一次但在过去两个月内未售出的所有商品。第一个版本(我已回答)将包含从未售出的物品。第二个将其排除在外。)

写的是完全相同的内容。+1第一个返回了一个空结果集,但第二个完成了我要查找的内容。谢谢这真的很让人苦恼,我希望这两个表的结果都是一样的。这可能是因为我必须加入orders和items表,因为ItemId不在order表中?