Jag skulle välja något som:
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
Flytta AND
till join-satsen gör att sammanfogningen lyckas eller misslyckas, vilket är avgörande att de resulterande raderna behålls där det inte finns någon matchande rad i den "rätta" tabellen.
Om det fanns i WHERE
, skulle jämförelser med NULL (där det inte finns någon kampanjkod) misslyckas och tas bort från resultaten.