Jeg ville vælge noget 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
Flytning af AND
til join-klausulen gør, at joinforbindelsen lykkes eller mislykkes, og det er afgørende, at de resulterende rækker holdes, hvor der ikke er nogen matchende række i den 'rigtige' tabel.
Hvis det var i WHERE
, ville sammenligningerne med NULL (hvor der ikke er nogen kampagnekode) mislykkes og blive elimineret fra resultaterne.