2015-12-12 5 views
1

У меня есть 2 стола, стол Месяцы и стол Ad. Я хотел бы вернуть все отдельные электронные письма из Ad в месяц.mysql count with 0

Таблица Ad: created_at - DATETIME.

Таблица Месяцы: id_month (INT и первичный ключ)

enter image description here

я попытался с левой присоединиться:

SELECT Months.id_month,count(distinct Ad.email) 
FROM `Months` left outer join `Ad` 
ON id_month = MONTH(Ad.created_at) 
GROUP BY id_month 
ORDER BY id_month ASC 

Но нет никакого результата за декабрь и она не возвращается 0. (только результаты за месяцы от 1 до 11)

Любая идея?

Я обнаружил, что, если добавить это условие:

WHERE YEAR(Ad.created_at)=2015 

, то он не возвращает 0 за декабрь .. почему?

+0

Вы уверен, что месяцы таблицы есть 'декабря (12)' месяц –

+0

, что вы имеете в виду, да табличные месяцы содержат 12 строк, в том числе декабря (я обновил с PrintScreen столовых месяцев) – Julien

+1

Works здесь http://sqlfiddle.com/#!9/69302/1 –

ответ

2

На основе замечаний OP на @Dhaval Asodariya ответ

Вы должны переместить фильтр Ad в ON состоянии условия LEFT join.

Если вы сохраняете фильтр правого бокового стола в where, то пункт Left outer join будет неявно преобразован в INNER JOIN.

SELECT months.id_month, 
     Count(DISTINCT ad.email) 
FROM `months` 
     LEFT OUTER JOIN `ad` 
        ON id_month = Month(ad.created_at) 
         AND Year(ad.created_at) = 2015 
GROUP BY id_month 
ORDER BY id_month ASC 
+0

ok, да, правильный ответ, решена. Большое вам спасибо. почему «где» не работает? – Julien

+0

ОК понял, спасибо большое VR46! – Julien

+0

@Julien - В вопросе всегда вы должны добавить точный код, который вы используете –

0
SELECT Months.id_month,count(distinct Ad.email) 
FROM `Months` left join `Ad` 
ON id_month = MONTH(Ad.created_at) 
GROUP BY id_month 
ORDER BY id_month ASC 
+0

спасибо, но я пробовал также без «внешнего», но он не меняет sthg .. – Julien

+0

Где это изменение –

+0

Используйте группу по ad.created_at так что вы сможете узнать, что происходит, это может помочь SELECT Months.id_month, count (раздельный адрес) FROM 'Months' left join' Ad' ON id_month = MONTH (Ad.created_at) GROUP BY MONTH (Ad.created_at) ORDER BY id_month ASC –

1

Попробуйте

SELECT Months.id_month,count(Ad.email) Emails 
FROM `Months` 
JOIN `Ad` ON Months.id_month = MONTH(Ad.created_at) 
GROUP BY Months.id_month 
ORDER BY Months.id_month ASC 
+0

спасибо, но все тот же .. – Julien

+0

Я попробовал снова, то же самое. – Julien

+1

@Julien - Вы проверили ссылку, которую я предоставил http://sqlfiddle.com/#! 9/69302/1 –

0

Try с помощью если заявления. Я только что проверил в рабочем состоянии SQLFIDDLE.

SELECT months.id_month, 
     IF(Count(DISTINCT ad.email), Count(DISTINCT ad.email), 0) 
FROM `months` 
     LEFT OUTER JOIN `ad` 
        ON id_month = Month(ad.created_at) 
GROUP BY id_month 
ORDER BY id_month ASC