2012-02-22 25 views
21

tengo esta consulta para obtener el número de PlayerSession s con reconnect = TRUE, agrupados por Player.country:filas contamos con una condición específica en la consulta agregada

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 

me gustaría modificarlo para mostrar no sólo la vuelve a conectar número de sesiones, sino también el recuento total, algo así como:

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 

es esto posible, y si es así, ¿cuál es la sintaxis correcta?

+0

Ver http://stackoverflow.com/questions/4414539/easiest-way-to-get- a-total-count-and-a-count-of-a-subset para varios enfoques – kaj

Respuesta

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

El siguiente será suficiente

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 

simplemente Reescribí la consulta. Siempre tendrá una fila de Player por cada PlayerSession, por lo que la cambió para que sea INNER JOIN. Además, no era necesaria la CONCAT como siempre habrá filas PlayerSession en esta consulta (a menos que no hay sesiones)

+0

Hmm, parece que los paréntesis no coinciden. –

+0

Disculpa por eso, ceguera de soporte, corregido :) –

+3

En una prueba rápida, encontré que el método SUM (IF()) que se muestra aquí era más rápido que el método COUNT (CASE) que se muestra en la respuesta aceptada. – 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' es redundante, si no especifica un' ELSE' el resultado es 'NULL', sin embargo, esto es bastante trivial y soy fanático de usar' COUNT' en lugar de 'SUM (CASE WHEN ... THEN 1 ELSE 0 END) 'cuando el resultado deseado es un conteo y no una suma, ¡así que obtuviste mi voto! También cambie COUNY to COUNT ... – GarethD

+0

@GarethD - Sé que es redundante, pero lo deja más claro de esa manera – Lamak

Cuestiones relacionadas