2010-02-02 23 views
10

katılmak sol Tüm kampanyalar için tüm kampanya_kodlarının bir sayısı WHERE campaign_codes.status, 0 VEYA kampanya için kampanya_kod kaydı bulunmayan yerlerde 0.MySQL satırların sayılması ve ben 2 tablolar, kampanyalar ve campaign_codes sahip problemi

aşağıdaki SQL WHERE deyimi campaign_codes hiçbir karşılık gelen kayıtları var bu kampanyaları ortadan kaldırır tabii

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 

cevap

19
(i de sıfır campaign_codes ile bu kampanyaları istiyorum) Ben var ama

ben istiyorum önemlisi nerede ther sonuçlanan satırları tutarak, başarılı veya başarısız katılmak yapar katılmak maddeye AND Hareketli

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 

: böyle bir şey için tercih e, 'doğru' tabloda eşleşen bir satır değil.

WHERE içeriyorsa, NULL (hiçbir kampanya_kodu yok) karşılaştırmaları başarısız olur ve sonuçlardan kaldırılabilir.

+0

Teşekkürler! Bu hile yaptı. AND'nin nasıl kullanıldığına dair bir okumaya ya da bir işaretçiye bayılırım. – k00k

+0

Sorduğum şey, birisinin AND'yi NEREDEYEN yerleştirmeden önce bir kaynağa açıklayabileceğini veya bana kaynak gösterip gösteremeyeceğini sormak. Bunu geçmişte kullanmadım ve gerçekten anlamadığımdan emin değilim. – k00k

+0

@ k00k, "Neden" –

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 
İlgili konular