每天生成日期列表并统计在线帖子

时间:2014-05-07 12:50:49

标签: mysql list date union concat

我希望收到类似示例输出的结果。 每天列出两个日期和公司在线帖子的数量。

例如:

TABLE 
id  | online_From  | online_To  | comp_id  
11  | 2014-04-02   | 2014-04-05 | 20
12  | 2014-04-11   | 2014-04-16 | 21 
13  | 2014-04-03   | 2014-04-07 | 20
17  | 2014-04-29   | 2014-04-30 | 23
19  | 2014-04-04   | 2014-04-11 | 20

我想收到:

SAMPLE OUTPUT 
2014-04-01 | 0 
2014-04-02 | 1 
2014-04-03 | 2 
2014-04-04 | 3 
2014-04-05 | 3 
2014-04-06 | 2 
2014-04-07 | 2
2014-04-08 | 1 
2014-04-09 | 1 
2014-04-10 | 1
2014-04-11 | 1 
2014-04-12 | 0 
2014-04-13 | 0
…
2014-05-07 | 0 

我使用这个mysql代码列出了请求的日期(并且还分为生成图表的y / m / d / w):

select selected_date, year(selected_date) as y, day(selected_date) as d, week(selected_date) as w, month(selected_date) as m from
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) 
selected_date from (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,  
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
where selected_date between '2014-04-01' and '2014-05-07' 
GROUP BY y,m,d ORDER BY y ASC, m ASC, d ASC


2014-04-01|2014 |1 |14 |4 |0
2014-04-02|2014 |2 |14 |4 |1 
2014-04-03|2014 |3 |14 |4 |2
…

这来自:How to get list of dates between two dates in mysql select query

我尝试了很多东西,但我从未成为希望的结果。 我想循环使用日期并检查当天在线的帖子数量。

希望有人可以帮助我!

由于

2 个答案:

答案 0 :(得分:1)

如果你想要一个只有SQL的答案,这应该可以帮到你。已拨打您的表comp_table ...

select d.selected_date,d.d,d.m,d.y,
count(ct.id)
from 
(
 select selected_date, year(selected_date) as y, day(selected_date) as d, week(selected_date) as w, month(selected_date) as m from
 (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) 
 selected_date from (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,  
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
 where selected_date between '2014-04-01' and '2014-05-07' 
 GROUP BY selected_date
) d 
left outer join comp_table ct on d.selected_date between ct.online_From and ct.online_To
group by d.selected_date
order by 1 asc
;

您可能最好定期填充all_dates表以代替内联视图使用。会更高效!

修改

如果你想保持'给所有日期都给我们的日期,即使他们有0个计数',但过滤结果,例如在comp_id列之后,只需更改left outer join即可包含filter by子句。例如:

select d.selected_date,d.d,d.m,d.y,
count(ct.id)
from 
(
 select selected_date, year(selected_date) as y, day(selected_date) as d, week(selected_date) as w, month(selected_date) as m from
 (select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) 
 selected_date from (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,  
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
 (select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
 where selected_date between '2014-04-01' and '2014-05-07' 
 GROUP BY selected_date
) d 
left outer join comp_table ct 
     on d.selected_date between ct.online_From and ct.online_To 
        and ct.comp_id = 20
group by d.selected_date
order by 1 asc
;

答案 1 :(得分:0)

如果您尚未安装,我建议您安装common_schema。安装完成后,您可以使用numbers表来简化查询。

例如,此查询应该为您提供所需的输出:

select days.day,count(distinct your_table.id) from 
(
  select '2014-04-01' + interval n day AS day
  from common_schema.numbers
  having day between '2014-04-01' and '2014-05-07'
) days
  left outer join your_table on your_table.online_From <= days.day and your_table.online_To >= days.day
group by days.day
order by days.day