我的读数表架构如下所示:
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/