MYSQL通过获取组的所有值
DB有3列(thing1、thing2、datetime)。我要做的是,为具有多个唯一thing2条目的thing1提取所有记录MYSQL通过获取组的所有值,mysql,Mysql,DB有3列(thing1、thing2、datetime)。我要做的是,为具有多个唯一thing2条目的thing1提取所有记录 SELECT thing1,thing2 FROM db WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY thing1 HAVING COUNT(DISTINCT(thing2)) > 1; 获取我所需的内容,但当然“groupby”使其仅返回thing1列的1个条目,但我需要所有t
SELECT thing1,thing2 FROM db WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR) GROUP BY thing1 HAVING COUNT(DISTINCT(thing2)) > 1;
获取我所需的内容,但当然“groupby”使其仅返回thing1列的1个条目,但我需要所有thing1、thing2条目
如果您有任何建议,我们将不胜感激。我认为您应该这样使用group
SELECT thing1,thing2
FROM db WHERE datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY thing1, thing2 HAVING COUNT(*) > 1;
如果我了解您要查找的内容,您将希望使用当前查询作为子查询:
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
);
子查询已经获得了所需的
内容1
s,因此这允许您从表中获取原始行,仅限于那些内容1
s。无耻地复制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`
;
MySQL对于WHERE
子句中的子查询非常挑剔,性能也很好;此JOIN
备选方案可能比此类查询执行得更快
与当前形式相比,它的执行速度也可能更快,从子查询中删除了MIN
(和连接条件),并在外部上提供了冗余的datetime条件
哪一个最好取决于数据、硬件、配置等
旁注:我要注意不要使用诸如datetime
之类的关键字作为字段(或表)名称;它们往往会在最不经意的时候咬用户,至少应该总是用“如示例所示”进行转义。子查询以查找您想要的东西,然后加入以查找这些thing1值的记录。这是行不通的——它可以轻松返回没有多个thing2记录的thing1:为具有多个唯一thing2的thing1拉取所有记录。。。这只是检查多个唯一的日期…这将给出多次出现的thing1和thing2的组合,而不是具有多个thing2值的thing1记录。编辑:@sgedes,它甚至不在乎日期是否唯一。@uuerdo--好的一点,只要存在多个,日期时间实际上可能是相同的。啊,是的,这正是我要找的。谢谢,真的。额外的括号对查询没有任何影响。是的,我删除了我的原始评论(当你修复它时我正在编辑)。他们不会影响这个查询,但我看到很多人被他们的暗示误导了。这可能会起作用,但在某些情况下也可能返回不正确的结果。由于外部查询没有限制日期的结果,因此可能存在在该日期之前包含thing2的记录,但它们仍然会在不进行额外检查的情况下返回。。。还是一个比另一个答案更好的解决方案,而且不确定这是否重要。@sgedds如果你是对的,你可以在外层的where中添加额外的检查。