Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL通过获取组的所有值_Mysql - Fatal编程技术网

MYSQL通过获取组的所有值

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

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个条目,但我需要所有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中添加额外的检查。