日期范围是最后七天。目前我正在从这个查询中获取数据
counts dates
1 2018-12-25
1 2018-12-26
3 2018-12-30
查询是
select COALESCE(Count(campaign_id), 0) as counts,date(start_date) as dates from campaigns where segment_id=30
and date(start_date) BETWEEN DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND CURDATE()
group by date(start_date)
但我想要的是预期的产出
counts dates
0 2018-12-24
1 2018-12-25
1 2018-12-26
0 2018-12-27
0 2018-12-28
0 2018-12-29
3 2018-12-30
2条答案
按热度按时间6pp0gazn1#
你需要一种生成所有日期的方法。标准答案是使用
left join
还有一张日历表或其他有日期的表。在您的情况下,您的表可能已经包含了所有日期。如果是这样,最简单的方法是条件聚合:
你会注意到我还修改了
where
子句中的函数调用start_date
. 这允许mysql优化器使用索引(如果有的话)。vs3odd8k2#
您可以使用生成7行
information_schema
的视图,例如information_schema.tables
```select (select count(*)
from campaigns
where start_date = e.dates
) count,
e.dates
from
(
select *
from campaigns c
right join
(
SELECT @cr := @cr + 1 as rn,
date_sub(curdate(), interval 7 - @cr day) as dates
from information_schema.tables c1
cross join (SELECT @cr := 0, @segID := 30) r
where @cr<7
) d on c.campaign_id = d.rn
where coalesce(c.segment_id,@segID) = @segID
) e;
count dates
0 24.12.2018
1 25.12.2018
1 26.12.2018
0 27.12.2018
0 28.12.2018
0 29.12.2018
3 30.12.2018