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表中?