Mysql count group by и left join не работают должным образом - PullRequest
2 голосов
/ 13 сентября 2011

Ниже приведен простой запрос для отслеживания кликов. Я просмотрел много других постов и чесал голову. Я не могу заставить этот запрос работать так, чтобы отображались все строки из календарной таблицы (один календарный день на строку):

SELECT DATE_FORMAT(calendar_date, '%a %D') AS calendar_date, 
count( tracker_id ) as clicks
FROM calendar
LEFT JOIN offer_tracker USING(calendar_id)
WHERE 
  calendar_month = Month(CURDATE()) AND 
  calendar_year = Year(CURDATE()) AND ( offer_id = 4 OR offer_id IS NULL )
GROUP BY calendar_date;

Это почти там, но не все строки в таблице календаря возвращаются, т. Е. Нет пятницы 2, вт 6, ср 7 и т. Д .:

result set

У кого-нибудь есть идеи, где я ошибаюсь? Должен ли я использовать подзапрос?

1 Ответ

4 голосов
/ 13 сентября 2011

Я думаю, offer_id из таблицы offer_tracker. Если у вас есть (левое) внешнее объединение и вы используете поле из правой таблицы в состоянии WHERE (например, ваше offer_id = 4), объединение фактически отменяется и дает те же результаты, что и внутреннее объединение.

Попытка отменить отмену (offer_id = 4 OR offer_id IS NULL) не работает, как вы ожидаете. Любая строка из offer_tracker с offer_id <> 4 уже прошла LEFT JOIN, но удалена из-за условия WHERE. Таким образом, строка с Friday 2nd не появится в результатах, если для этой даты есть строка с offer_id, отличная от 4.


Переместите чек offer_id = 4 на LEFT JOIN, вместо:

SELECT DATE_FORMAT(calendar_date, '%a %D') AS calendar_date
     , count( tracker_id ) as clicks
FROM calendar
  LEFT JOIN offer_tracker 
    ON  offer_tracker.calendar_id = calendar.calendar_id
    AND offer_id = 4
WHERE calendar_month = Month(CURDATE())
  AND calendar_year = Year(CURDATE()) 
GROUP BY calendar_date
...