Left Outer Join не возвращает все строки из моей левой таблицы? - PullRequest
10 голосов
/ 16 января 2011

Я пытаюсь получить количество открытий страницы в день, используя следующий запрос.

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking ON day.days = DAY(FROM_UNIXTIME(open_date)) 
WHERE tracking.open_id = 10 
GROUP BY day.days

Вывод, который я получаю, это:Дело в том, что в моей дневной таблице у меня есть один столбец, который содержит числа от 1 до 30, представляющие дни в месяце.Я выполнил левое внешнее объединение, и я ожидаю, что все дни будут отображаться в столбце дней!

Но мой запрос делает это, почему это может быть?

Ответы [ 2 ]

50 голосов
/ 16 января 2011

Ответ Нанне , данный объясняет, почему вы не получаете желаемый результат (ваше предложение WHERE удаляет строки), но не как его исправить.

Решение состоит в том, чтобы изменить WHERE на AND, чтобы условие было частью условия объединения, а не фильтра, примененного после объединения:

SELECT day.days, COUNT(*) as opens 
FROM day 
LEFT OUTER JOIN tracking
ON day.days = DAY(FROM_UNIXTIME(open_date)) 
AND tracking.open_id = 10 
GROUP BY day.days

Теперь все строки в левой таблице будут присутствовать в результате.

14 голосов
/ 16 января 2011

Вы указываете, что связанный tracking.open_id должен быть 10. Для других строк это будет NULL, поэтому они не будут отображаться!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...