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条目。
任何建议都将不胜感激。
答案 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
个。