2013-03-29 64 views
2

我一直在搜索谷歌的答案,我很確定它比我更容易,我想學習正確的方式來做到這一點。我有一個表emails_sent,我選擇計數和按列分組。每行有3 type - 「確認」,「1天」和「同一天」之一。我也在某個日期前完成這個任務。所以我們可以說,這裏是一個例子查詢我選擇今天:從一個MySQL表中選擇,即使計數爲0,返回計數(id)

SELECT Count(id) AS count, 
     type 
FROM emails_sent 
WHERE Date_format(date, '%Y-%m-%d') = '2013-03-29' 
GROUP BY type 
ORDER BY type; 

這是它返回:

+-------+---------+ 
| count | type | 
+-------+---------+ 
| 32 | confirm | 
|  4 | 1day | 
+-------+---------+

這是偉大的,但也有第三個「型」出現這種情況今天有0條記錄,但我需要它來計算,即使它是0.

我也試着創建一個第二個表,只有這3個「類型」,並使用正確的連接,但它仍然不會拉0計數。這就是我對兩張桌子做的事情:

SELECT t.type, 
     Count(s.id) AS count 
FROM emails_sent s 
     RIGHT JOIN email_types t 
       ON s.type = t.type 
WHERE Date_format(s.date, '%Y-%m-%d') = '2013-03-29' 
GROUP BY t.type; 

我確定這只是簡單的東西,我錯過了。

+1

無法將行添加到不存在的查詢。 SQL方面唯一的解決方案是擁有一個你期望的所有值的表格,並加入到這個表格中。一種解決方案可能是選擇所有類型的唯一值,然後將其加入到子查詢集合函數中。 –

回答

0

試試這個

SELECT t.type, 
     COALESCE(Count(s.id), 0) AS count 
FROM email_types t 
     LEFT JOIN email_sent s 
       ON s.type = t.type 
WHERE Date_format(s.date, '%Y-%m-%d') = '2013-03-29' 
GROUP BY t.type; 

注:我已經使用了LEFT JOIN代替,如1 type has many emails

+0

該查詢正確地提取數據,但仍未顯示其他「類型」的計數爲0。 – ryes31

+0

@ ryes31是的,它會顯示爲'0'沒有電子郵件可用 – Akash

+0

謝謝你們!完善! – ryes31

0

如果我理解正確的問題,不能你只是假設,如果你沒有得到創紀錄對於某種類型,那是因爲有0個條目?

+0

是的,這是正確的,但我寧願讓它從我的初始查詢中獲得計數,而不必添加更多PHP代碼來解決任何缺失的電子郵件類型。我知道我可以這樣做,但是我覺得我可能從一開始就學習它是正確的方式:) – ryes31

+0

看看貝利S的評論。您不能添加不存在的查詢。你可以用PHP代碼來完成,但你仍然需要查詢所有的「類型」,看看哪些是缺失的。有些人可能不同意,但我認爲報告應該在PHP方面進行處理。您可以查詢您所能做的,並使用腳本語言選擇您的報告。 – ArgumentNullException