【问题标题】:I have two select queries and two tables.I need to develop the second table without duplicates that will be present from the first table我有两个选择查询和两个表。我需要开发第二个表,而不需要从第一个表中出现的重复项
【发布时间】:2013-10-30 22:10:33
【问题描述】:

我的第一个表的查询是:

Select * from orders where edited_date<DATE_SUB(now(),interval 48 hour);

我的第二张表的查询是:

Select * from orders where edited_date<DATE_SUB(now(),interval 24 hour);

与第一个表相比,第二个表应该只显示过滤后的记录。 我正在使用 mysql。

【问题讨论】:

标签: mysql sql


【解决方案1】:

您需要BETWEEN 运算符来排除两个查询中的重复项:

Select * from orders where edited_date BETWEEN DATE_SUB(now(),interval 24 hour) AND edited_date<DATE_SUB(now(),interval 48 hour);
Select * from orders where edited_date<DATE_SUB(now(),interval 48 hour);

【讨论】:

  • 仍然没有得到我想要的。我只需要找到我的问题中写的两个查询之间的区别。感谢您的回复
  • 澄清你的问题。如果您的第一个表将输出类似 (3, 4, 5) 和第二个:(1, 2, 3, 4, 5)。你期望输出什么?我的答案接下来输出:(3, 4, 5) 和 (1, 2)。附言数字 (1, 2, 3, 4, 5) 表示结果集中的行
  • 第一个表输出(3,4,5)和第二个(1,2,3,4,5)。我想要两者之间的区别(1,2)
  • 你试过我的答案了吗?阅读我的评论? “我的答案接下来输出:(3, 4, 5) 和 (1, 2)”... 你需要 (1,2)。我的答案输出它。如果你只想要 (1,2) 而没有 (3, 4, 5) 你可以省略一个查询。
【解决方案2】:

根据您的 cmets,您似乎在这两个查询中重复了行,并且您正在寻找集合差异。如果你有一个id 列,这很容易:

; WITH H48 AS (
    SELECT * FROM orders WHERE edited_date<DATE_SUB(now(),interval 48 hour)
), H24 AS (
    SELECT * FROM orders WHERE edited_date<DATE_SUB(now(),interval 24 hour)
)
SELECT * FROM H48 WHERE id NOT IN (SELECT id FROM H24);

这是你要找的吗?

【讨论】:

    【解决方案3】:

    试试这个查询

    Select orderid from orders 
    where 
    edited_date<DATE_SUB(now(),interval 24 hour) 
    AND 
    orderid 
    NOT IN(Select orderid from orders where 
    edited_date<DATE_SUB(now(),interval 48 hour))
    

    Demo on fiddle

    【讨论】:

      【解决方案4】:

      MySQL 不支持 INTERSECT 和 MINUS 集合运算符。 INTERSECT 运算符获取两个查询的结果并仅返回出现在两个结果集中的行。

      MINUS 运算符获取一个查询的不同行并返回未出现在第二个结果集中的行。我们可以使用 JOIN 运算符重写这些查询:

      使用 MINUS 运算符的示例查询:

       SELECT x, y FROM table_a
       MINUS
       SELECT x, y FROM table_b;
      

      在 MySQL 中:

       SELECT a.x, a.y
       FROM table_a a LEFT JOIN table_b b
       ON a.x = b.x AND a.y = b.y
       WHERE b.x IS NULL;
      

      您可以在查询中尝试此逻辑。

       Select a.* 
       from orders a LEFT JOIN orders b
       ON a.column=b.column   ---- add on condition
       where a.edited_date<DATE_SUB(now(),interval 48 hour) and        
             b.edited_date<DATE_SUB(now(),interval 48 hour)
      

      供参考see this post

      【讨论】:

      • 但是我将如何对上述两个查询使用这种语法,因为我的两个查询都已经包含 where ,以及我将如何再次使用它来连接
      • 我已经更新了答案,但只是添加了 ON 条件,看看这是否可以帮助你。
      猜你喜欢
      • 2015-04-19
      • 2015-06-22
      • 2019-09-23
      • 1970-01-01
      • 2018-11-22
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多