Rozhodl bych se pro něco jako:
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
Přesunutí AND
do klauzule spojení způsobí, že spojení bude úspěšné nebo se nezdaří, což zásadně udržuje výsledné řádky tam, kde není žádný odpovídající řádek v 'správné' tabulce.
Pokud by to bylo v WHERE
, srovnání s hodnotou NULL (kde není žádný kód kampaně) by selhalo a bylo by z výsledků vyloučeno.