2012-02-22 51 views
21

Tôi có truy vấn này để có được số lượng PlayerSession s với reconnect = TRUE, nhóm lại theo Player.country:hàng Đếm với một điều kiện cụ thể trong truy vấn tổng hợp

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 

Tôi muốn sửa đổi nó để hiển thị không chỉ là kết nối lại số phiên, nhưng cũng có tổng số, chẳng hạn như:

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 

Điều này có thể, và nếu đúng, cú pháp thích hợp là gì?

+0

Xem http://stackoverflow.com/questions/4414539/easiest-way-to-get- a-total-count-và-a-count-of-a-tập hợp con cho các cách tiếp cận khác nhau – kaj

Trả lời

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

Sau đây sẽ đủ

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 

tôi chỉ viết lại truy vấn. Bạn sẽ luôn có một hàng Player cho mỗi PlayerSession, do đó thay đổi nó thành một INNER JOIN. Ngoài ra, CONCAT không cần thiết vì sẽ luôn có các hàng PlayerSession trong truy vấn này (trừ khi không có phiên nào)

+0

Hmm, nó xuất hiện các dấu ngoặc đơn không khớp. –

+0

Xin lỗi về điều đó, khung mù, cố định :) –

+3

Trong một thử nghiệm nhanh, tôi thấy phương thức SUM (IF()) được hiển thị ở đây nhanh hơn phương thức COUNT (CASE) được hiển thị trong câu trả lời được chấp nhận. – 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' là thừa, nếu bạn không chỉ định' ELSE' kết quả là 'NULL', tuy nhiên điều này là khá nhỏ và tôi là người hâm mộ sử dụng' COUNT' thay vì 'SUM (CASE WHEN ... THEN 1 ELSE 0 END) 'khi kết quả mong muốn là một số và không phải là tổng, vì vậy bạn đã nhận được phiếu bầu của tôi! Ngoài ra, hãy đổi COUNY thành COUNT ... – GarethD

+0

@GarethD - Tôi biết điều đó là thừa, nhưng điều đó làm cho nó rõ ràng hơn theo cách đó – Lamak

Các vấn đề liên quan