MySQL - подсчет строк и проблема с левым соединением - PullRequest
11 голосов
/ 02 февраля 2010

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

кампании: id, partner_id, статус

коды кампании: идентификатор, код, статус

Я хочу получить количество всех кодов кампаний для всех кампаний, ГДЕ кампания_кодов.status равно 0 ИЛИ, если для кампании нет записей кодов кампаний.

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

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

Ответы [ 2 ]

20 голосов
/ 02 февраля 2010

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

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 к предложению объединения приводит к успешному или неудачному объединению, что принципиально сохраняет результирующие строки там, где в «правой» таблице нет подходящей строки.

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

3 голосов
/ 02 февраля 2010
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
...