2009-03-05 42 views
2

我想從某個時間段(比如一週)獲取註冊數量,這並不難,但我想知道是否它無論如何,MySQL可以在沒有註冊的日子裏返回零。如何在沒有統計的日子裏從Mysql獲取數據

一個例子: DATA:

 
ID_Profile datCreate 
1 2009-02-25 16:45:58 
2 2009-02-25 16:45:58 
3 2009-02-25 16:45:58 
4 2009-02-26 10:23:39 
5 2009-02-27 15:07:56 
6 2009-03-05 11:57:30 

SQL:

 
    SELECT 
     DAY(datCreate) as RegistrationDate, 
    COUNT(ID_Profile) as NumberOfRegistrations 
    FROM tbl_profile 
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY) 
    GROUP BY RegistrationDate 
    ORDER BY datCreate ASC; 

在這種情況下,結果將是:

 
RegistrationDate NumberOfRegistrations 
25 3 
26 1 
27 1 
5 1 

很顯然,我失蹤了兩天在之間。目前我正在用我的php代碼解決這個問題,但是我想知道MySQL是否有辦法自動爲缺失的日期/行返回0。這將是理想的結果:

 
RegistrationDate NumberOfRegistrations 
25 3 
26 1 
27 1 
28  0 
1  0 
2  0 
3  0 
4  0 
5 1 

這樣我們就可以使用MySQL來解決有關的天數在一個月,而不是依賴於PHP代碼的任何問題,來計算每月多少天有,因爲MySQL有這個功能的版本。提前

回答

4

沒有

謝謝,但一個解決辦法是建立一個單一的列的表與日期主鍵,使用日期每天預裝。從最早的起點到最近的將來,你都會有日期。

現在,您可以左鍵加入您的統計數據 - 那麼您將在沒有數據的情況下得到空值。如果你真的想要零而不是零,請使用IFNULL(colname, 0)

+0

@保羅 - 你打敗了我。有沒有一種方法可以定義默認值爲零,以便在沒有數據的日子裏,左連接將爲零而不是空值? – 2009-03-05 13:36:03

1

感謝Paul Dixon,我找到了解決方案。任何對我如何解決此問題感興趣的人都可以閱讀:

首先創建一個存儲過程,我在某處找到了用來填充今年所有日期的表。

 
CREATE Table calendar(dt date not null); 

CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT) 
    BEGIN 
    SET @begin = 'INSERT INTO calendar(dt) VALUES '; 
    SET @date = start_date; 
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY); 
    SET @temp = ''; 
    REPEAT 
     SET @temp = concat(@temp, '(''', @date, '''), '); 
     SET @date = ADDDATE(@date, INTERVAL 1 DAY); 
     UNTIL @date > @max 
    END REPEAT; 
    SET @temp = concat(@temp, '(''', @date, ''')'); 
    SET result_text = concat(@begin, @temp); 
    END 


    call sp_calendar('2009-01-01', '2010-01-01', @z); 

    select @z; 

然後更改查詢,添加左連接:

 
SELECT 
    DAY(dt) as RegistrationDate, 
    COUNT(ID_Profile) as NumberOfRegistrations 
FROM calendar 
LEFT JOIN 
    tbl_profile ON calendar.dt = tbl_profile.datCreate 
WHERE dt BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY) AND CURDATE() 
GROUP BY RegistrationDate 
ORDER BY dt ASC 

,我們就大功告成了。

感謝所有的快速回復和解決方案。

相關問題