ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 连接表中两个日期之间不存在记录的位置

2019-06-30 14:02:02  阅读:102  来源: 互联网

标签:mysql sql


我正在尝试选择过去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个月内没有订购.一年前订购的事实并不重要.

Widget C不应该出现,因为在过去2个月内放置了包含Widget 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,sql
来源: https://codeday.me/bug/20190630/1337218.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有