Ich würde mich für so etwas entscheiden:
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
Verschieben des AND
an die join-Klausel führt dazu, dass der Join erfolgreich ist oder fehlschlägt, wobei es wichtig ist, dass die resultierenden Zeilen dort bleiben, wo es keine übereinstimmende Zeile in der 'richtigen' Tabelle gibt.
Wenn es im WHERE
wäre , würden die Vergleiche mit NULL (wo es keinen Kampagnencode gibt) fehlschlagen und aus den Ergebnissen eliminiert werden.