2016-05-10 44 views
1

DB有3列(thing1,thing2,datetime)。我想要做的是为thing1提取所有记录,该记录有超过1个唯一的thing2条目。MYSQL获取GROUP BY的所有值

SELECT thing1,thing2 FROM db WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY thing1 HAVING COUNT(DISTINCT(thing2)) > 1; 

获取我几乎我所需要的,但当然“GROUP BY”使得它如此它只返回了thing1列1项,但我需要的所有thing1,thing2条目。

任何建议将不胜感激。

+0

子查询找到你想要的thing1,然后加入找到这些thing1值的记录。 – Uueerdo

回答

2

我想你应该通过这种方式使用组

SELECT thing1,thing2 
FROM db WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
GROUP BY thing1, thing2 HAVING COUNT(*) > 1; 
+0

这不会起作用 - 它可以很容易地返回一个没有多个thing2记录的东西:'拉动拥有多个唯一thing2'的thing1的所有记录......这只是检查多个唯一的日期...... – sgeddes

+0

这将给出多次出现的thing1,thing2的组合,而不是具有多个thing2值的thing1记录。编辑:@sgeddes,它甚至不关心如果日期是唯一的。 – Uueerdo

+0

@Uueerdo - 好点,日期时间可能实际上是相同的,只要存在多个日期。 – sgeddes

0

如果我理解你在找什么,你要使用当前的查询作为一个子查询:

SELECT thing1, thing2 FROM db WHERE thing1 IN (
    SELECT thing1 FROM db 
    WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
    GROUP BY thing1 
    HAVING COUNT(DISTINCT thing2) > 1 
); 

子查询已经得到您想要的thing1,所以这可以让您从表中获取原始行,仅限于那些thing1 s。

+0

是的。无论如何,额外括号对查询都没有影响。 –

+0

是的,我删除了我原来的评论(当我修正时,我正在编辑它)。他们不会伤害到这个问题,但我已经看到很多人误导他们的意思。 – Uueerdo

+0

这可以工作,但在某些情况下也可能返回不正确的结果。由于外部查询不限制日期的结果,因此可能在该日期之前有thing2的记录,但是它们仍然会在没有额外检查的情况下返回......仍然是更好的解决方案,其他答案并不确定如果那甚至很重要。 – sgeddes

1

无耻抄袭马特S”原来的答复为出发点,以提供一种替代...

SELECT db.thing1, db.thing2 
FROM db 
INNER JOIN (
    SELECT thing1, MIN(`datetime`) As `datetime` 
    FROM db 
    WHERE `datetime` >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
    GROUP BY thing1 
    HAVING COUNT(DISTINCT thing2) > 1 
) AS subQ ON db.thing1 = subQ.thing1 AND db.`datetime` >= subQ.`datetime` 
; 

MySQL是非常挑剔的,性能明智的,当谈到在WHERE条款子查询;这JOIN替代可能执行比这样的查询更快。

它也可能执行速度比当前形式更快,MIN从子查询中删除(以及连接条件),而在外部WHERE上提供冗余日期时间条件。

哪家最好将取决于数据,硬件,配置等...

旁注:我奉劝不要使用关键字,如datetime的字段(或表)名称;他们倾向于在最不可预料的时候咬他们的用户,而且至少应该总是像``例子一样逃脱。