我的读数表架构如下所示:
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语句不会返回任何行?如何使其表现一致?
答案 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`;