Ik zou kiezen voor iets als:
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
De AND
. verplaatsen aan de join-clausule zorgt ervoor dat de join slaagt of mislukt, waarbij de resulterende rijen cruciaal blijven waar er geen overeenkomende rij is in de 'juiste' tabel.
Als het in de WHERE
, zouden de vergelijkingen met NULL (waar er geen campagnecode is) mislukken en uit de resultaten worden verwijderd.