2016-01-21 94 views
1

我想要通過計算在同一天創建了多少個條目來可視化我的條目。按日期分組,即使日期沒有條目

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

回答

1

你只需要補償的表,它可能是一個真正的表或一些像飛行一樣建造的東西,如select 0 ofs union all select -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; 

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

對於性能,可能會更好,以限制數據(日誌)表中搜索:

select 
    date_add('20160121', interval days.ofs day) as created_at, 
    count(data.id) as cnt 
from days left outer join 
    (select * from logs where created_at between <start> and <end>) data 
    on datediff(data.created_at, '20160121') = days.offset 
group by days.offset 
order by days.offset; 

一個缺點是,你必須有一個參數化這個在幾個表達式中固定錨點日期。將真正日期的表格放在某個表格中可能會更好,因此您不必進行計算。

+0

這就是它!我將硬編碼日期更改爲NOW(),它工作正常:) – mimo

+0

@mimo酷。如果你實際上不想在報告中覆蓋8天,希望你拿出-7。 – shawnt00

0

使用號RIGHT JOIN的日期表,所以您可以申請每一天和每一天的數據,無論是否有數據都有數據,簡單來說,精簡的日期將顯示爲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 
+0

我只發現硬編碼日期的左連接示例。 – mimo

+0

但是,這不是一個小工作嗎?我必須每年都更新一次這張表,所以我不能在飛行中創建一個表格來返回最近7天的表格嗎? – mimo

+0

您可以每年創建一次365行的年度表格,這可以通過循環輕鬆完成,也可以每週創建7天的表格。重要的是,如果在日誌表上沒有給定日期插入事件,則無法在沒有外部表的幫助下顯示缺少的日期。我的意見是,年度表非常有幫助。我從Kimaballs的模特書中學到了東西。 – datelligence