У меня есть 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