获取“COUNT”/“GROUP BY”MySQL查询的空结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取“COUNT”/“GROUP BY”MySQL查询的空结果相关的知识,希望对你有一定的参考价值。

我遇到的问题与此处发布的问题类似:How can I get a non empty result set when using select, group by and count?

但是,回答者提到的解决方案较慢。我只是想知道是否有任何替代解决方案而不影响性能?

另外,我不明白为什么一个查询像:

SELECT
`a`, `b`, COUNT(*) as `c`
FROM `mytable` 
WHERE `status` = 1
GROUP BY `a`,`b`

将返回空结果,只有没有'GROUP BY'部分它会显示预期结果,0为计数值?这可能是一个可能的mysql错误吗?

我也找到了关于mysql bug门户的讨论,类似的问题,这里:http://bugs.mysql.com/bug.php?id=26087

但我猜这个讨论还不够成熟,无法得到合适的答案。

我的问题:

  • 这可能是一个可能的mysql错误吗?
  • 是否有可能有一个比给定的更好的替代解决方案(开头的链接)?如果有,怎么样?
答案

这不是MySQL的错误。

聚合查询将为每个遇到的组返回一行。没有group by,有一组 - 整个表。我承认这有点棘手,因为即使表中没有行,仍然有一个组。

使用group by,每组有一行。如果组中没有行,则该组不会出现。在您的情况下,查询:

SELECT `a`, `b`, COUNT(*) as `c`
FROM `mytable` 
WHERE `status` = 1

将返回一行,两个NULLs,然后是0

相同的查询:

GROUP BY `a`,`b`

将不返回任何行,因为没有行来形成组。

另一答案

实际上,它不是MySQL的错误。但您可以先定义派生表,然后计算其结果。我认为这种行为是因为MySQL操作的层次结构。

SELECT
`a`, `b`, COUNT(*) as `c`
FROM ( SELECT `a`, `b`
FROM `mytable` 
WHERE `status` = 1
GROUP BY `a`,`b`) t

以上是关于获取“COUNT”/“GROUP BY”MySQL查询的空结果的主要内容,如果未能解决你的问题,请参考以下文章

mysql在group by之后如何获取每一组中id最大的那一行

mysql在group by之后如何获取每一组中id最大的那一行

MySQL 查询:GROUP BY - 获取特定行(不总是第一行)

MySQL 基本应用 count() 与 group by

MySQL:优化 COUNT(*) 和 GROUP BY

group by 获取最大的一组 count(1) 值