按日期分组,即使日期没有条目

时间:2016-01-21 19:21:19

标签: mysql sql date group-by

我希望通过计算在同一天创建的条目数来可视化我的条目。

SELECT dayname(created_at), count(*) FROM logs
group by day(created_at)
ORDER BY created_at desc
LIMIT 7

所以我得到了类似的东西:

Thursday    4  
Wednesday   12  
Monday  4  
Sunday  1  
Saturday    20  
Friday  23  
Thursday    10

但是我也希望星期二在那里有0,所以我有一个星期。

有没有办法用完整的mysql执行此操作,还是需要在将结果提供给图表之前更新结果?

修改

这是最终查询:

SELECT
    DAYNAME(date_add(NOW(), interval days.id day)) AS day,
    count(logs.id) AS amount
FROM days LEFT OUTER JOIN
    (SELECT *
    FROM logs
    WHERE TIMESTAMPDIFF(DAY,DATE(created_at),now()) < 7) logs
    on datediff(created_at, NOW()) = days.id
GROUP BY days.id
ORDER BY days.id desc;

表日包括0到-6之间的数字

2 个答案:

答案 0 :(得分:1)

你只需要一张偏移表,它可以是真正的表格或像2016/01/21 15:21:14.071| DEBUG| login.action.Login| in setPassword() 2016/01/21 15:21:14.071| DEBUG| login.action.Login| in setUserId(mike) 2016/01/21 15:21:14.071| DEBUG| login.action.Login| validate(25137882): Begin 2016/01/21 15:21:14.072| DEBUG| login.action.Login| No Password. 2016/01/21 15:21:14.110| DEBUG| login.action.Login| validate: End 一样构建的东西。

select 0 ofs union all select -1 ...

http://sqlfiddle.com/#!9/3e6bc7/1

对于性能,最好限制数据(日志)表中的搜索:

create table days (ofs int);
insert into days (ofs) values
     (0), (-1), (-2), (-3),
    (-4), (-5), (-6), (-7);

select
    date_add('20160121', interval days.ofs day) as created_at,
    count(data.id) as cnt
from days left outer join logs data
    on datediff(data.created_at, '20160121') = days.ofs
group by days.ofs
order by days.ofs;

一个缺点是你必须在几个表达式中使用固定的锚定日期对其进行参数化。最好在某个地方的桌子上放一张真实日期表,这样你就不必进行计算了。

答案 1 :(得分:0)

使用 RIGHT JOIN 到日期表,这样您就可以请求每天和所有日期的数据,无论某些日子是否有数据,只需将mull天显示为CERO或NULL。

您可以创建日期表,某种日历表。

 id_day | day_date   |
 --------------------
 1      | 2016-01-01 |
 2      | 2016-01-02 |
 .
 .
 365    | 2016-12-31 |

使用此表格,您可以关联日期,然后使用MYSQL DATE AND TIME FUNCTIONS

提取日期,月份,星期或任何您想要的内容
 SELECT t2.dayname(day_date), count(t1.created_at) FROM logs t1 right join dates_table t2 on t1.created_at=t2.day_date group by t2.day_date ORDER BY t1.created_at desc LIMIT 7