2010-02-02 9 views
10

में शामिल होने के 2 टेबल, अभियान और campaign_codes है छोड़ दिया सभी अभियानों के लिए सभी campaign_codes की गिनती जहां campaign_codes.status 0 के बराबर है या जहां अभियान के लिए कोई अभियान_codes रिकॉर्ड नहीं है।MySQL गिनती पंक्तियों और समस्या

मैं निम्नलिखित एसक्यूएल, लेकिन निश्चित रूप से WHERE कथन उन अभियानों जो campaign_codes में कोई संगत रिकॉर्ड समाप्त

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
WHERE c.partner_id = 4 
AND cc.status = 0 
GROUP BY c.id 

उत्तर

19
(मैं शून्य campaign_codes साथ उन अभियानों के साथ-साथ चाहते हैं)

मैं था की तरह कुछ के लिए चुनते हैं: में शामिल होने के लिए खंड AND चलती

SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
AND cc.status = 0 -- Having this clause in the WHERE, effectively makes this an INNER JOIN 
WHERE c.partner_id = 4 
GROUP BY c.id 

बनाता सफल या असफल शामिल होने, महत्वपूर्ण जहां वहाँ में जिसके परिणामस्वरूप पंक्तियों रखने ई 'दाएं' तालिका में कोई मिलान पंक्ति नहीं है।

यदि यह WHERE में था, तो NULL (जहां कोई अभियान_code नहीं है) की तुलना विफल हो जाएगी, और परिणामों से समाप्त हो जाएगी।

+0

धन्यवाद! वह चाल है। कुछ और पढ़ने के लिए एक स्पष्टीकरण या सूचक से प्यार होगा कि कैसे और इसका उपयोग किया जा रहा है। – k00k

+0

मैं जो पूछ रहा हूं वह यह है कि अगर कोई मुझे कहां से पहले और पहले रखने के संसाधन को समझा सकता है या मुझे इंगित कर सकता है। अतीत में इसका उपयोग नहीं किया है और यकीन नहीं है कि मैं वास्तव में इसे समझता हूं। – k00k

+0

@ k00k ने थोड़ा और विस्तार जोड़ा "क्यों" –

3
SELECT 
    c.id AS campaign_id, 
    COUNT(cc.id) AS code_count 
FROM 
    campaigns c 
LEFT JOIN campaign_codes cc on cc.campaign_id = c.id 
    AND c.partner_id = 4 
    AND cc.status = 0 
GROUP BY c.id 

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

  • कोई संबंधित समस्या नहीं^_^