2017-08-04 35 views
1

我在MySQL數據庫中有2個表,主機和events,可以加入謝謝和ID字段。 我的查詢感興趣的特定字段是hosts表,name;爲events,type。 如果我讓他們之間的一個連接,一個例子的結果是:不同類型的Mysql計數

enter image description here

所以,在此圖像中,你可以看到的例子,主機阿希爾公頃4個事件:操作系統類型2,應用1時間和服務類型1。

我的問題是:使用聚合運算符,是否可以製作一個tabel,對於每個主機,我可以顯示按類型劃分的事件數量? 更speficically,所需的表可能有這樣的標題:

enter image description here

,在aour previuos例如,可能會返回:

| Achille | 1 | 2 | 1 | 
| Aiace | 1 | 1 | 0 | 
| Ulisse | 0 | 0 | 1 | 

我的第一次嘗試是這個查詢:

SELECT hosts.name, count(e1.type) as Applications, count(e2.type) as OS, count(e3.type) as Type 
    FROM hosts JOIN events e1 ON hosts.id = e1.host_id 
    JOIN events e2 ON hosts.id = e2.host_id 
    JOIN events e3 ON hosts.id = e3.host_id 
    WHERE e1.type = 'Applications' AND e2.type = 'OS' AND e3.type = 'Services' 
GROUP BY hosts.name; 

但不起作用。

回答

2

您不需要多次加入事件表。只要做條件聚合。

SELECT h.name, 
    count(case when e.type = 'Applications' then 1 end) as Applications, 
    count(case when e.type = 'OS' then 1 end) as OS, 
    count(case when e.type = 'Services' then 1 end) as Services 
FROM hosts h 
JOIN events e ON h.id = e.host_id 
GROUP BY h.name; 

或簡潔,使用sum

SELECT h.name, 
    sum(e.type = 'Applications') as Applications, 
    sum(e.type = 'OS') as OS, 
    sum(e.type = 'Services') as Services 
FROM hosts h 
JOIN events e ON h.id = e.host_id 
GROUP BY h.name; 
+0

謝謝!這工作完美。但我必須承認我的無知;我們在sql中有case選項嗎?或者是PLSQL?那麼1結束指令的作用是什麼? –

+1

'CASE'是一個sql關鍵字。 1只是一個非空值,您可以在其中寫入任何非空值。這裏,條件滿足時返回1,不滿足則返回null。計數功能只計算非空值 – GurV

+0

@LucaSepe https://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html – CBroe