mysql - 为什么这个 group by 语句不返回任何行?

标签 mysql sql

我的读数表架构如下所示:

id | date | item_id | module_id | reading

我的基本查询正常运行并始终返回一行(如果在指定日期之间有读数则返回一个值,如果没有则返回 null)。

select SUM(`reading`) as `reading` from `readings` 
where `item_id`=1 
and `date` between '2014-02-01' and '2014-02-20';

但现在我想像这样添加一个 group by 语句:

select SUM(`reading`) as `reading` from `readings` 
where `item_id`=1 
and `date` between '2014-02-01' and '2014-02-20'
group by `module_id`;

它现在仅在指定日期之间有读数时才返回一行。如果指定日期之间没有读数,则返回零行

我的问题是为什么添加这个 group by 语句不返回任何行?如何使其行为一致?

最佳答案

当您没有group by 语句时,SQL 定义是为结果创建一个组。即使没有行匹配也是如此。

当您有一个group by 语句时,每个组都会被创建。如果没有行,则不会创建组。

在某些方面,这种行为是不一致的,但它是 SQL 的工作方式。如果你想获得更多行,你可以使用条件聚合重写查询:

select module_id,
       SUM(case when `item_id`= 1 and `date` between '2014-02-01' and '2014-02-20' then `reading`
           end) as `reading`
from `readings` 
group by `module_id`;

这将为每个 module_id 返回一行。如果没有行符合条件,则 reading 的值将为 NULL。您可以通过将 else 0 添加到 case 语句来使其成为 0

关于mysql - 为什么这个 group by 语句不返回任何行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290796/

相关文章:

mySQL正则表达式选择字符串和增量数字

php - 这是重建给定用户 session 的正确方法吗?

c# - 如何将数据表行与列表框项目进行比较

java - 硬编码 SQL 语句 VS。用于执行查询的 Web 服务

mysql - 如何选择和更新涉及两个表的查询

php - 我将如何在 sql 查询中执行数学运算来计算百分比差异?

sql - 选择查询具有给定值的行的百分比?

php - Insert Into on DUPLICATE KEY 更新错误

php - 第一次mysqli,出现INSERT错误

sql - 从另一个表中选择列中的相似值并在主表中使用另一个表值