2012-02-22 10 views
21

私はPlayer.countryごとにグループ化され、reconnect = TRUEPlayerSession秒数を取得するには、このクエリを持っている:カウント行

SELECT 
    country, 
    COUNT(*) AS with_reconnect 
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id) 
WHERE reconnect = TRUE 
GROUP BY country 

私が再接続だけではなくを表示するように変更したいのですがセッション数だけでなく、合計数などを入力します。

SELECT 
    country, 
    COUNT(*) AS total, 
    (COUNT WHERE reconnect = TRUE) AS with_reconnect 
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id) 
GROUP BY country 

これが可能ですか?その場合、正しい構文は何ですか?

+0

はhttp://stackoverflow.com/questions/4414539/easiest-way-to-get-を参照してください。 a-total-count-and-a-a-a-count-of-a-a-a-countの数々のアプローチについて – kaj

答えて

49
SELECT Country, 
     COUNT(*) AS Total, 
     COUNT(CASE WHEN Reconnect = true THEN 1 END) AS With_Reconnect 
FROM PlayerSession S 
     LEFT JOIN Player P 
      ON P.id = S.player_id 
GROUP BY country 
0
SELECT 
    country, 
    COUNT(*) AS total, 
    sum(case when reconnect = TRUE then 1 else 0 end) AS with_reconnect 
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id) 
GROUP BY country 
16

以下は、私は、クエリを書き直し

SELECT 
    p.country, 
    COUNT(*) AS total, 
    SUM(IF(s.reconnect=TRUE,1,0)) AS with_reconnect 
FROM PlayerSession s 

INNER JOIN Player p 
ON p.id = s.player_id 

GROUP BY p.country 

十分でしょう。 PlayerSessionごとにPlayerの行が常にあるため、INNER JOINに変更されます。また、常にPlayerSession行がこのクエリであるだろうと必要に応じていませんでしたCONCAT(セッションがない限り)

+0

括弧が一致していないようです。 –

+0

申し訳ありませんがブラケットブラインド固定: –

+3

クイックテストでは、ここに表示されているSUM(IF())メソッドが、受け入れられた回答に示されているCOUNT(CASE)メソッドよりも高速でした。 – arlomedia

1
SELECT 
    country, 
    COUNT(CASE WHEN reconnect = TRUE THEN S.player_id ELSE NULL END) AS with_reconnect, 
    COUNY(*) 
FROM PlayerSession S LEFT JOIN Player P ON (P.id = S.player_id) 
GROUP BY country 
+0

'ELSE NULL'は冗長ですが、' ELSE'を指定しないと結果は 'NULL'ですが、これはかなり簡単です。私は' SUM(CASE WHEN ... THEN 1 ELSE 0 END) 'のようになります。希望の結果が合計ではなくカウントである場合、あなたは自分の投票を得ます! COUNYをCOUNTに変更してください... – GarethD

+0

@GarethD - それは冗長であることはわかっていますが、それはそれをより明確にします – Lamak