I have 2 tables, campaigns and campaign_codes:
campaigns: id, partner_id, status
campaign_codes: id, code, status
I want to get a count of all campaign_codes for all campaigns WHERE campaign_codes.status equals 0 OR where there are no campaign_codes records for a campaign.
I have the following SQL, but of course the WHERE statement eliminates those campaigns which have no corresponding records in campaign_codes ( i want those campaigns with zero campaign_codes as well)
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
WHERE c.partner_id = 4
AND cc.status = 0
GROUP BY c.id
I’d opt for something like:
Moving the
ANDto the join clause makes the join succeed or fail, crucially keeping resulting rows in where there is no matching row in the ‘right’ table.If it were in the
WHERE, the comparisons to NULL (where there is no campaign_code) would fail, and be eliminated from the results.