MYSQL获取GROUP BY的所有值

时间:2016-05-10 21:58:17

标签: mysql

DB有3列(thing1,thing2,datetime)。我想要做的是为所有具有1个以上唯一的thing2条目的thing1提取所有记录。

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

几乎得到我所需要的东西,但当然是#34; GROUP BY"使得它只返回thing1列的1个条目,但我需要所有的thing1,thing2条目。

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:2)

我认为你应该通过这种方式使用群组

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

答案 1 :(得分:1)

无耻地复制Matt 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`
;

对于WHERE子句中的子查询,MySQL在性能方面非常挑剔;此JOIN备用可能执行速度比此类查询更快。

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

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

旁注:我会警告不要使用datetime等关键字作为字段(或表)名称;他们倾向于在最不期望的时候咬他们的用户,并且至少应该总是使用`来举例说明。

答案 2 :(得分: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个。