MySQL - подсчет строк и проблема с левым соединением

У меня есть 2 таблицы, кампании и campaign_codes:

campaign: id, partner_id, status

campaign_codes: id, code, status

Я хочу получить подсчет всех кампаний-кодов для всех кампаний. WHERE campaign_codes.status равно 0 или где нет записей кампаний_кодов для кампании.

У меня есть следующий SQL, но, разумеется, оператор WHERE устраняет те кампании, у которых нет соответствующих записей в campaign_codes (я тоже хочу, чтобы эти кампании были нулевые.)

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

Ответ 1

Я бы выбрал что-то вроде:

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

Перемещение AND в предложение join делает соединение успешным или неудачным, что важно, в результате чего результирующие строки находятся там, где нет соответствующей строки в таблице справа.

Если бы это было в WHERE, сравнения с NULL (где отсутствует какой-либо campaign_code) потерпели бы неудачу и были бы исключены из результатов.

Ответ 2

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 c.partner_id = 4
    AND cc.status = 0
GROUP BY c.id