2013-12-17 54 views
1

我對MySQL的運行下面的查詢返回計數「計數()」

SELECT DATE(field) AS day, COUNT(*) AS totalSessions 
FROM table 
GROUP BY DATE(field) 
ORDER BY field DESC 
LIMIT 7 

它返回

day  | totalSessions 
2013-12-17 | 5 
2013-12-15 | 1 

我需要什麼來改變我的查詢,以便我會得到結果

day  | totalSessions 
2013-12-17 | 5 
2013-12-16 | 0 
2013-12-15 | 1 
2013-12-14 | 0 
2013-12-13 | 0 
2013-12-12 | 0 
2013-12-11 | 0 
+0

2013-12-16,2013-12-14等表中是否有條目? – Robbert

+0

@Robbert不,沒有。我希望有一種方法可以將NULL會話變爲0會話。 – mhopkins321

+1

左加入表格。 – Mihai

回答

2

您可能需要存儲(某處)想要返回的日期。我認爲,一個存儲過程可以幫助你:

delimiter $$ 
create procedure getStuff(d0 date, d1 date) 
begin 
    declare d date; 
    drop table if exists temp_dates; 
    create temporary table temp_dates (
     d date not null primary key 
    ); 
    set d = d0; 
    while d <= d1 do 
     insert into temp_dates values (d); 
     set d = date_add(d, interval +1 day); 
    end while; 
    select 
     a.d as day, 
     count(b.field) as totalSessions 
    from 
     temp_dates as a 
     left join yourTable as b on a.d = b.dateField -- Assuming "dateField" holds the date 
    group by 
     a.d; 
end $$ 
delimiter ; 

希望這有助於

+1

切記:臨時表僅對創建它們的連接可見。 – Barranka

1

不是最好看的解決方案,但值得一試:

SELECT 
    FAKE.dt, 
    COUNT(YT.id) AS totalSessions 
FROM (
    SELECT DATE(NOW()) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 1 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 2 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 3 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 4 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 5 DAY)) as dt 
    UNION SELECT DATE(DATE_SUB(NOW(), INTERVAL 6 DAY)) as dt 
) FAKE 
LEFT JOIN yourtable YT ON YT.datefield = FAKE.dt 
GROUP BY FAKE.dt 
ORDER BY FAKE.dt DESC 

所以,你選擇7個日期向後從今天開始,工會結果,左邊加入你需要的數據,按日期分組和排序。