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

时间:2014-04-25 10:41:55

标签: 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';

但是现在我想添加一个像这样的语句组:

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语句不会返回任何行?如何使其表现一致?

2 个答案:

答案 0 :(得分:2)

如果没有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。您可以通过将0添加到else 0语句来改为case

答案 1 :(得分:0)

为我工作

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