2012-04-14 78 views
1

我有一張跟蹤發送郵件的表格。這很簡單。在比較年度統計數據時填充缺少日期的MYSQL數據?

ID | DATETIME |電子郵件| SUBJECT | MESSAGE

我一直在收集數據好幾年。有些日子,我在桌子上沒有任何條目。

QUERY1:

SELECT COUNT(ID) FROM emails 
WHERE DATE(datetime) >= 'XXXX-XX-XX' 
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ' 
GROUP BY DATE(datetime) 

我然後使用一些PHP獲得前一年兩個XXXX和YYYY和運行是一樣的第一第二查詢...

QUERY2:

SELECT COUNT(ID) from emails 
WHERE DATE(datetime) >= 'XXXX-XX-XX' 
AND DATE(datetime) is <= 'ZZZZ-ZZ-ZZ' 
GROUP BY DATE(datetime) 

我用一個圖表來比較我多少封電子郵件得到的日期範圍,然後我覆蓋我多少封電子郵件得到了相同的範圍僅一年之前。這是兩個查詢現在我繪製結果。

問題在於mysql在2011年沒有任何電子郵件,但在2012年有一些在同一天。

將結果結合起來並將結果繪製成圖表,結果表明結果偏離了結果,因爲我缺少去年當天的日期和0值,實際上使得我的所有值不再匹配。

2011-03-01 10 2012-03-01 4 
2011-03-02 4  2012-03-02 2 
2011-03-03 6  2012-03-04 1 <---- see where the two queries 
           end up diverging? (I had nothing 
           logged for 2012-03-03 so naturally 
           it was not in the results. 

有沒有一種辦法可以讓MySQL輸出我需要包括其中值出現在一年,但不是另一個或者如果沒有值出現在任何一年(尚需日期和0),所以我的圖表日期數據作品?

我似乎無法弄清楚如何做到這一點...

謝謝!

+0

您是否在查詢中嘗試過'between'子句? '從日期(日期時間)'XXXX-XX-XX'和'ZZZZ-ZZ-ZZ'按日期(日期時間)組合的電子郵件中選擇計數(ID)' – hjpotter92 2012-04-14 19:36:58

回答

2

有幾種不同的方式可以得到一組連續的日期結果。我最喜歡的是使用虛擬表格或AI PK現有的連續ID創建所需的全套設備。像這樣的東西 -

SELECT '2011-01-01' + INTERVAL (id -1) DAY 
FROM dummy 
WHERE id BETWEEN 1 AND 365 

這將返回全套天的2011年,然後可以留下加入到您的電子郵件表,以獲得計數 -

SELECT `dates`.`date`, COUNT(emails.id) 
FROM (
    SELECT '2011-01-01' + INTERVAL (id - 1) DAY AS `date`, '2011-01-01 23:59:59' + INTERVAL (id - 1) DAY AS `end_of_day` 
    FROM dummy 
    WHERE id BETWEEN 1 AND 365 
) `dates` 
LEFT JOIN emails 
    ON `emails`.`datetime` BETWEEN `dates`.`date` AND `dates`.`end_of_day` 
GROUP BY `dates`.`date` 

來填充您的虛擬/序列表你可以手動插入前十位的值,然後使用INSERT ...選擇要添加的休息 -

CREATE TABLE dummy (id INTEGER NOT NULL PRIMARY KEY); 
INSERT INTO dummy VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 
SET @tmp := (SELECT MAX(id) FROM dummy) + 1; 
INSERT INTO dummy 
SELECT @tmp + id 
FROM dummy; 

您需要的INSERT ... SELECT查詢每次運行前執行設置查詢。

+0

因此,我需要創建'虛擬'表並填充它用ID | DATE cols然後插入幾年前的每個日期,並在未來幾年插入?或者,這是'虛擬'表某種臨時表,我不理解... – user409858 2012-04-14 19:45:09

+0

我有一個'seq(id INTEGER NOT NULL PRIMARY KEY)'表在我的大多數數據庫中包含一組連續的ID 0到9999(有時更大),因爲它對於做這類事情很有用。請注意,它只包含一個整數字段,可以在需要時將其處理成各種各樣的東西,例如本例中的日期。 – nnichols 2012-04-14 19:48:08

+0

啊......好的。我將製作一張虛擬桌子並在其中投入9999條記錄並嘗試您的建議。謝謝。使用純MYSQL循環並將9999記錄插入該虛擬表中的最佳語法是什麼?我可以做到這一點的PHP,但必須有一個很好的乾淨的'while'聲明,將工作。 – user409858 2012-04-14 19:58:23