2017-02-17 24 views
2

我有一個名爲LOG的表,在這個表中我有一個名爲水平的列,並有3個可能的值:'信息' ,'警告','錯誤'。使用'分組'和'WHERE'的SQL查詢返回0計數,如果他們沒有數據

我想利用每本價值的算的,所以我的查詢是

SELECT Level, COUNT(*) AS Count FROM LOG GROUP BY Level 

結果我得到的是一些以「錯誤」:X,「INFO」:Y,「WARN」: Z.

我有第二列名爲'記錄器',可以採取很多值,例如'上傳數據'。現在我想只爲記錄儀添加WHERE條件= '上傳數據'

SELECT Level, COUNT(*) AS Count FROM LOG WHERE Logger='Upload Data' GROUP BY Level 

現在的結果我得到的是一些以 '錯誤':X, 'INFO':Y.

'WARN'失蹤

這是我的問題。

如何修改此查詢以返回此結構 'ERROR':X,'INFO':Y,'WARN':。

如果沒有數據?

+0

發表您的表數據 –

回答

1

您可以使用UNION ALL

SELECT Level, SUM(`Count`) AS `Count` 
FROM (
    SELECT Level, COUNT(*) AS `Count` FROM LOG WHERE Logger='Upload Data' GROUP BY Level 
    UNION ALL 
    SELECT Level, 0 AS `Count` FROM LOG GROUP BY Level 
) t 
GROUP BY Level 
+0

這具有原始問題的風險,如果整個日誌表已經不是單一特定級別的實例。具體來說,如果整個日誌表的行數爲零,則它將輸出零行,而不是預期的具有零計數的三行。我建議爲Levels創建一個單獨的表,或者爲三個日誌級別創建三個union-all。 – inquisitive

0

嘗試這一個 -

SELECT 
    Level, 
    COUNT(IF(Logger='Upload Data', Logger, NULL)) AS COUNT 
FROM LOG 
GROUP BY Level 
+0

「no such function:IF:SELECT」error – GomuGomuNoRocket

+0

請顯示您的結果查詢。這裏是一個IF函數 - https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#function_if – Devart