MySQL क्वेरी में IF कंडीशन के साथ गणना करें


115

मेरे पास दो टेबल हैं, एक खबर के लिए है और दूसरी टिप्पणी के लिए है और मैं उन टिप्पणियों की गिनती प्राप्त करना चाहता हूं जिनकी स्थिति स्वीकृत हो गई है।

SELECT
    ccc_news . *, 
    count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

लेकिन इस प्रश्न के साथ समस्या यह है कि टिप्पणी कॉलम के लिए प्राप्त किया जाने वाला न्यूनतम मान 1 है कि क्या उस समाचार के अनुरूप कोई टिप्पणी मौजूद है या नहीं।

कोई मदद अत्यधिक प्रशंसनीय होगी।


5
यदि आप COUNT के बजाय SUM का उपयोग करते हैं तो क्या होगा?
जॉन पिक

जवाबों:


265

के sum()स्थान पर उपयोग करेंcount()

नीचे कोशिश करें:

SELECT
    ccc_news . * , 
    SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON
        ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

11
या यहां तक ​​कि SUM (ccc_news_comments.id = 'स्वीकृत') को MySQL-विशिष्ट चाल के रूप में
mojuba

1
@mojuba 100% समान नहीं है, आपकी चाल nullतब लौटती है जब COUNT(कोई भी स्थिति नहीं) वापस आ जाती 0। जब COUNTकुछ भी लौटा दिया है होगा लेकिन 0, लेकिन SUM करता है वापसी 0, अपनी चाल रिटर्न 0
रॉबिन कैंटर

@mojuba मामला और बिंदुnum_relevant_partsहै SUM, शर्तों के साथ num_total_partsहै COUNT(parts.id)(डबल टिप्पणी के लिए खेद है, संपादित करने के लिए बहुत देर हो चुकी थी)
रॉबिन Kanters

68

बेहतर अभी भी (या वैसे भी कम):

SUM(ccc_news_comments.id = 'approved')

यह काम करता है क्योंकि MySQL में बूलियन प्रकार को सी के समान दर्शाया गया है INT 0और 1(जैसे DB सिस्टम में पोर्टेबल नहीं हो सकता है)।

जैसा कि COALESCE()अन्य उत्तरों में बताया गया है, मूल्य प्राप्त करते समय कई भाषा एपीआई स्वचालित रूप से परिवर्तित NULLहो ''जाते हैं। उदाहरण के लिए PHP के mysqliइंटरफेस के बिना आपकी क्वेरी को चलाना सुरक्षित होगा COALESCE()


3
यह काफी अधिक पढ़ने योग्य sql कोड बनाता है। सुंदर समाधान।
दाग सोंडेरे हेंसन

22

यह काम करना चाहिए:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count()केवल जाँच करें कि मान मौजूद है या नहीं। 0 एक अस्तित्वगत मूल्य के बराबर है, इसलिए यह एक और गणना करता है, जबकि NULL एक गैर-मौजूद मूल्य की तरह है, इसलिए इसे गिना नहीं जाता है।


मुझे लगता countहै कि sumइस मामले में ज्यादा सहज है ।
जेफरी

4

इस पंक्ति को बदलें:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

इसके साथ:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments

गिनती (यदि (ccc_news_comments.id = 'अनुमोदित', ccc_news_comments.id, 0)) ??? यदि आप ccc_news_comments.id का उपयोग करते हैं तो राशि का उपयोग करने का क्या अर्थ होगा

क्षमा करें आपके कहने का क्या मतलब है? बूलियन मान 0 या 1 हो जाता है, फिर योग होता है, और यदि 0 के साथ कुछ अशक्त मान हो तो
Mosty Mostacho

@MostyMostacho, क्या COALESCEराशि लौटाता है? MySQL doc में कोई संदर्भ?
इस्तियाक अहमद

हाँ, यह क्यों नहीं होगा? डॉक्स में कई संदर्भ हैं: dev.mysql.com/doc/refman/5.7/en/…
Mosty Mostacho
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.