2012-02-22 26 views
21

मैं reconnect = TRUE साथ PlayerSession रों की संख्या प्राप्त करने के लिए इस क्वेरी, 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 

यह संभव है, और यदि ऐसा है तो, उचित सिंटैक्स क्या है?

+0

http://stackoverflow.com/questions/4414539/easiest-way-to-get- देखें विभिन्न दृष्टिकोण – 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 

मैं सिर्फ क्वेरी दुबारा लिखा पर्याप्त होगा। प्रत्येक प्लेयर सत्र के लिए आपके पास हमेशा एक प्लेयर पंक्ति होगी, इसलिए इसे एक INNER जॉइन के रूप में बदल दिया गया। इसके अलावा concat की जरूरत नहीं था के रूप में वहाँ हमेशा इस क्वेरी में PlayerSession पंक्तियों हो जाएगा (जब तक वहाँ कोई सत्र हैं)

+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

'ईएलएसई न्यूल' अनावश्यक है, यदि आप 'ईएलएसई' निर्दिष्ट नहीं करते हैं तो परिणाम 'शून्य' है, हालांकि यह काफी मामूली है और मैं 'SUM के बजाय' COUNT' का उपयोग करने का प्रशंसक हूं (जब भी ... फिर 1 ईएलएसई 0 ईएनडी) 'जब वांछित परिणाम एक गिनती है और राशि नहीं है, तो आपको मेरा वोट मिला! COUNY को COUNT में भी बदलें ... – GarethD

+0

@GarethD - मुझे पता है कि यह अनावश्यक है, लेकिन यह इसे और अधिक स्पष्ट बनाता है – Lamak

संबंधित मुद्दे