gpt4 book ai didi

mysql - 连接表中两个日期之间不存在记录的地方

转载 作者:可可西里 更新时间:2023-11-01 07:35:54 25 4
gpt4 key购买 nike

我正在尝试选择过去 2 个月内所有未售出的商品。

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

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 表中获取所有记录(按商品 ID 分组),当且仅当它们在过去两个月内没有被订购时。

当我在上面进行连接时,结果表类似于:

Name        OrderID     OrderDate
Widget A 1 Last Year
Widget B 2 Last Week
Widget C 3 Last Year
Widget C 4 Last Week

我的结果应该只返回 Widget A,因为它在过去 2 个月内没有被订购。一年多前订购的事实无关紧要。

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

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

我想从 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)

对于偶尔使用的几千个项目,任何一个版本都应该“足够快”。如果您的项目表要大得多,或者您需要在某种在线交易(而不是报告)期间执行此查询,则可以使用其他方法来编写它。您甚至可以使用 JOIN 来完成,但您只需加入一次订单,而不是两次。

(注意:您对请求中的问题有两种不同的定义。首先,您要求提供过去两个月内未售出的所有商品。然后,在摘要中,您要求提供所有商品至少售出一次但在过去两个月内没有售出。第一个版本(我回答的)将包括根本没有售出的元素。第二个不包括它们。)

关于mysql - 连接表中两个日期之间不存在记录的地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7449311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com