我正在使用query,当有一个活动时,我会得到count on dates,如果没有活动的日期范围,我也会得到count 0

jrcvhitl  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(420)

日期范围是最后七天。目前我正在从这个查询中获取数据

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
6pp0gazn

6pp0gazn1#

你需要一种生成所有日期的方法。标准答案是使用 left join 还有一张日历表或其他有日期的表。
在您的情况下,您的表可能已经包含了所有日期。如果是这样,最简单的方法是条件聚合:

select date(start_date) as dates,
       sum(segment_id = 30) cnt_30
from campaigns
where start_date >= date_sub(curdate(), interval 7 day) and
      start_date < date_add(curdate(), interval 1 day)
group by date(start_date);

你会注意到我还修改了 where 子句中的函数调用 start_date . 这允许mysql优化器使用索引(如果有的话)。

vs3odd8k

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

rextester演示

相关问题