2012-02-22 4 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-보기이 쿼리에 PlayerSession 행이있을 것으로 필요하지 않은 a-total-count-and-a-count-of-a-of-a-subset을 사용하여 다양한 접근 방식을 시도합니다. – 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으로 변경됩니다. 또한 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) 대신'COUNT'를 사용하는 팬입니다 1 ELSE 0 END)'원하는 결과가 합계가 아니라 합계이므로 내 표를 얻습니다! COUNY를 COUNTN으로 변경하십시오. – GarethD

+0

@GarethD - 중복되어 있음을 알고 있지만 더 명확하게 보여줍니다. – Lamak