2017-08-04 14 views
1

私はMySQLデータベースに2つのテーブルとホストとevents、ありがとうとIDフィールドに参加することができます。私のクエリに対する関心の 特定のフィールドは、hostsテーブルのため、nameです。 eventsの場合はtypeです。 私はそれらの間の結合を行う場合、例の結果は次のとおりです。OSタイプの2、応用の1:だから異なるタイプのMysqlカウント

enter image description here

、この画像では、あなたがホストアキッレヘクタールことを例えば4つのイベントを見ることができます時間とサービスタイプの1つ。

私の質問は:アグリゲータ演算子を使用すると、すべてのホストに対して、タイプごとにいくつのイベントが分割されているかを示すことができるテーブルを作ることが可能ですか? もっとspeficically、所望のテーブルは、このヘッダを有していてもよい:

enter image description here

aour previuos例では、返すことができること、:

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; 

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

私の最初の試みは、このクエリであります

ただし、動作しません。

答えて

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はnull値ではなく、null以外の値を書くことができます。ここでは、条件を満たすと1を返し、そうでない場合はnullを返します。カウント関数はNULL以外の値のみをカウントする – GurV

+0

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

関連する問題