【问题标题】:MYSQL Select/Group By: How do I remove a group from the result based on a value of one of it's members?MYSQL Select/Group By:如何根据其中一个成员的值从结果中删除组?
【发布时间】:2010-07-11 05:32:30
【问题描述】:

考虑下面的事件表。 OrderID 字段是 Orders 表的外键。

OrderID EventType TimeAdded* 已处理 1 ... 3 小时前 0 2 ... 5 分钟前 0 1 ... 2 小时前 0 1 ... 1 小时前 0 3 ... 12 分钟前 1 3 ... 3 小时前 0 2 ... 2 小时前 0

*TimeAdded 实际上是一个 mysql 日期时间字段。我在这里使用了人类可读的时间来使问题更容易阅读。


我需要获得一个包含每个 OrderID 的结果集,只有一次,但前提是所有附加到给定订单 ID、已进行状态为 0 的记录都已添加超过 15 分钟。

在此示例中,应从结果集中忽略订单 #2,因为它在过去 15 分钟内添加了一个未处理的事件。它有一个 2 小时前未处理的事件这一事实是无关紧要的。

应该包括订单#3。尽管其中一个条目是在 12 分钟前添加的,但该条目已被处理,不应考虑。此集合中只应考虑“3 小时前”条目,且大于 15 分钟前。

应该包括订单 #1,因为所有三个未处理的事件都发生在超过 15 分钟之前。

我不确定这是否需要使用子查询或 group by 或可能两者都使用?

伪代码:

SELECT * FROM OrderEvents WHERE Processed=0 GROUP BY OrderID
    OMIT WHOLE GROUP IF GROUP_MIN(TimeAdded) >= (NOW() - INTERVAL 15 MINUTE)

我只是不确定语法是否正确?

【问题讨论】:

    标签: mysql select group-by


    【解决方案1】:

    这将完成工作(在 MySQL Workbench 中测试):

    SELECT * FROM OrderEvents WHERE Processed = 0 GROUP BY OrderID
        HAVING MAX(TimeAdded) < (NOW() - INTERVAL 15 MINUTE);
    

    【讨论】:

      【解决方案2】:

      我认为是这样的:

      SELECT OrderID
      FROM OrderEvents
      WHERE Processed=0
      GROUP BY OrderID
      HAVING MAX(TimeAdded) < (NOW() - 1500);
      

      请记住,我在这里工作是盲目的。对于数字上下文中使用的函数 now(),我认为 1500 是正确的。 http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_now

      【讨论】:

        猜你喜欢
        • 2021-12-15
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多