![](/img/trans.png)
[英]MySQL select and group where members contain one value but not another
[英]MYSQL Select/Group By: How do I remove a group from the result based on a value of one of it's members?
请考虑下面的事件表。 OrderID字段是Orders表的外键。
OrderID EventType TimeAdded* Processed 1 ... 3 Hours Ago 0 2 ... 5 Minutes Ago 0 1 ... 2 Hours Ago 0 1 ... 1 Hour Ago 0 3 ... 12 Minutes ago 1 3 ... 3 Hours Ago 0 2 ... 2 Hours Ago 0
* TimeAdded是实际的mysql日期时间字段。 我在这里使用人类可读的时间来使问题更易于阅读。
我需要获得一个仅具有一次每个OrderID的结果集,但前提是在15分钟前添加了附加到给定订单ID的所有记录,这些记录的前进状态为0。
在此示例中,应该从结果集中忽略订单#2,因为它在最近15分钟内添加了未处理的事件。 从2小时前开始有未处理的事件这一事实是无关紧要的。
订单#3应该包括在内。 即使其中一个条目是在12分钟前添加的,该条目也已被处理,因此不应考虑。 此集合中仅应考虑“ 3小时前”条目,并且该条目大于15分钟前。
应该包含订单#1,因为与其相关的所有三个未处理事件都在15分钟前发生。
我不确定这是否需要使用子查询或分组依据,或者可能同时使用?
伪代码:
SELECT * FROM OrderEvents WHERE Processed=0 GROUP BY OrderID
OMIT WHOLE GROUP IF GROUP_MIN(TimeAdded) >= (NOW() - INTERVAL 15 MINUTE)
我只是不确定正确的语法?
这将完成工作(在MySQL Workbench中测试):
SELECT * FROM OrderEvents WHERE Processed = 0 GROUP BY OrderID
HAVING MAX(TimeAdded) < (NOW() - INTERVAL 15 MINUTE);
我认为这是遵循以下原则的:
SELECT OrderID
FROM OrderEvents
WHERE Processed=0
GROUP BY OrderID
HAVING MAX(TimeAdded) < (NOW() - 1500);
请记住,我在这里盲目工作。 我认为1500是正确的,对于在数字上下文中使用的now()函数。 http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_now
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.