Подсчет строк с определенным условием в совокупном запросе - PullRequest
27 голосов
/ 22 февраля 2012

У меня есть этот запрос, чтобы получить число PlayerSession с reconnect = TRUE, сгруппированное по Player.country:

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

Возможно ли это, и если да, то каков правильный синтаксис?

Ответы [ 4 ]

60 голосов
/ 22 февраля 2012
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
18 голосов
/ 22 февраля 2012

Следующего будет достаточно

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

Я просто переписал запрос. У вас всегда будет строка Player для каждой PlayerSession, поэтому измените ее на INNER JOIN. Также CONCAT не был необходим, так как в этом запросе всегда будут строки PlayerSession (если только нет сессий)

1 голос
/ 22 февраля 2012
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 голосов
/ 22 февраля 2012
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
...