在聚合查询中计算具有特定条件的行

Bar*_*lom 29 mysql sql count subquery aggregate-functions

我有这个查询来获取PlayerSessions 的数量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
Run Code Online (Sandbox Code Playgroud)

我想修改它不仅显示重新连接的会话计数,还显示总计数,例如:

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
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是这样,那么正确的语法是什么?

Gar*_*thD 63

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
Run Code Online (Sandbox Code Playgroud)


Sim*_*tal 18

以下就足够了

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
Run Code Online (Sandbox Code Playgroud)

我只是重写了查询.每个PlayerSession都会有一个Player行,因此将其更改为INNER JOIN.此外,不需要CONCAT,因为此查询中始终存在PlayerSession行(除非没有会话)

  • 在一个快速测试中,我发现此处显示的SUM(IF())方法比接受的答案中显示的COUNT(CASE)方法更快. (4认同)