2012-02-22 16 views
21

mam tej kwerendy, aby uzyskać liczbę PlayerSession sz reconnect = TRUE, pogrupowanych według Player.country:Hrabia wiersze z określonego warunku w zapytaniu łącznej

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 

chciałbym go zmodyfikować, aby pokazać nie tylko ponownym podłączeniu liczba sesji, ale także całkowita liczba, coś w rodzaju:

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 

Czy to możliwe, a jeśli tak, to jaka jest właściwa składnia?

+0

Zobacz http://stackoverflow.com/questions/4414539/easiest-way-to-get- a-total-count-and-a-count-of-a-subset dla różnych podejść – kaj

Odpowiedz

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

Poniższa wystarczą

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 

Właśnie przepisał zapytania. Zawsze będziesz miał rząd Gracza dla każdej Sesji Zawodowej, więc zmieniłeś ją na INNER JOIN. Również CONCAT nie była potrzebna, ponieważ nie zawsze będzie PlayerSession wiersze tego zapytania (o ile nie istnieją żadne sesje)

+0

Hmm, wygląda na to, że nawiasy nie pasują do siebie. –

+0

Przepraszam za to, ślepota wspornika, naprawiona :) –

+3

W jednym szybkim teście odkryłem, że przedstawiona tu metoda SUMA (JEŻELI()) była szybsza niż metoda LICZBA (CASE) pokazana w zaakceptowanej odpowiedzi. – 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' jest redundantne, jeśli nie określisz' ELSE' wynikiem jest 'NULL', jednak jest to dość banalne i jestem fanem używania' COUNT' zamiast 'SUM (CASE WHEN ... THEN 1 ELSE 0 END) 'gdy pożądany wynik to liczba, a nie suma, więc dostałem swój głos! Również zmień COUNY na COUNT ... – GarethD

+0

@GarethD - Wiem, że jest zbędne, ale dzięki temu jest bardziej jasne, że – Lamak

Powiązane problemy