2011-09-13 3 views
2

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

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; 

Это почти там, но не все строки в таблице расписания возвращаются т.е. нет пт второй, Вт шестой, седьмые и т.д. ср:

result set

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

+0

Может быть LEFT JOIN в случае, если некоторые строки имеют NULL значения в CALENDAR_ID – medopal

+0

Здравствуйте medopal, CALENDAR_ID в таблице offer_tracker установлено значение NOT NULL, и я не могу найти строки с нулевым значением в calendar_id, но спасибо, что пометили его как предложение. – Studio4

+0

Запрос верный. Mysql не смог вернуть результаты, когда нет места для ссылки на «Fri 2nd». Примерное решение будет похоже на http://stackoverflow.com/questions/7386530/return-multiple-copies-slightly-modified/7387014#7387014 – ajreal

ответ

4

Я думаю, что 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 
+0

ypercube, вы гений. Благодарим вас за помощь и полный ответ. – Studio4

Смежные вопросы