2012-02-22 26 views
21

Ben Player.country göre gruplandırılmış reconnect = TRUE ile PlayerSession s numarası almak için bu sorguyu vardır:Sayım satırları

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 

Sadece yeniden bağlanmaz göstermek için değiştirmek istediğiniz oturum sayısı değil, aynı zamanda toplam sayım, gibi bir şey:

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 

bu mümkün mü ve eğer öyleyse, doğru sözdizimi nedir?

+0

http://stackoverflow.com/questions/4414539/easiest-way-to-get- bakın bu sorguda PlayerSession satırlar olacaktır ihtiyaç kalmadı – kaj

cevap

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

şu Sadece sorgu yeniden yazdım

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 

yeterli olacaktır. Her PlayerSession için her zaman bir Player satırınız olacak, böylece bir INNER JOIN olarak değişti. Ayrıca CONCAT (hiçbir oturumları olmadığı sürece) her zaman

+0

Hmm, çeşitli yaklaşımlar için a-toplam sayma ve a-bir-bir-sayım, parantez eşleşmiyor görünür. –

+0

Bunun için üzgünüm, köşebent körlüğü, sabit :) –

+3

Tek bir hızlı testte, burada gösterilen SUM (IF()) yönteminin, kabul edilen yanıtta gösterilen COUNT (CASE) yöntemden daha hızlı olduğunu buldum. – 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' gereksizdir, eğer bir 'ELSE' belirtmezseniz sonuç 'NULL' olur, ancak bu oldukça önemsizdir ve ben' SUMA 'yerine' COUNT 'kullanmanın bir hayranıyım (CASE WHEN ... THEN ... 1 ELSE 0 END) 'İstenen sonuç bir sayı değil, bir toplam ise, oylarımı aldınız! Ayrıca COUNY öğesini COUNT ... – GarethD

+0

@ GarethD olarak değiştirin - Bunun gereksiz olduğunu biliyorum, ancak bu şekilde daha net – Lamak