Два SQL-соединения, два разных результата - PullRequest
3 голосов
/ 07 марта 2011

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

Запрос 1

SELECT COUNT(*) as opens, hours.hour as point 
FROM hours 
LEFT OUTER JOIN tracking ON hours.hour = HOUR(FROM_UNIXTIME(tracking.open_date)) 
WHERE tracking.campaign_id = 83 
AND tracking.open_date < 1299538799 
AND tracking.open_date > 1299452401 
GROUP BY hours.hour

Запрос 2

SELECT COUNT(*) as opens, hours.hour as point 
FROM hours 
LEFT JOIN tracking ON hours.hour = HOUR(FROM_UNIXTIME(tracking.open_date)) 
AND tracking.campaign_id = 83 
AND tracking.open_date < 1299538799 
AND tracking.open_date > 1299452401 
GROUP BY hours.hour

Разница в том, что первый запрос дает мне 18 строк, где нет строк между точками 17-22. Но когда я запускаю второй запрос, он показывает полностью24 строки, но для строк между 17 и 22 он имеет значение 1 !Я бы ожидал, что это будет 0 или NULL?Если это действительно 1, не должно ли оно появиться в первом запросе?

Как это произошло?

Ответы [ 4 ]

5 голосов
/ 07 марта 2011

первый JOIN действительно является INNER JOIN, внешняя объединенная таблица не должна появляться в предложении WHERE, как в верхнем запросе, вместо COUNT (*) выберите столбец из внешней объединенной таблицы

3 голосов
/ 07 марта 2011

Вы используете COUNT(*), который будет подсчитывать каждую строку в вашем наборе результатов (как написано), поскольку даже без данных в tracking у вас есть данные в hours.

Попробуйте изменить COUNT(*) на COUNT(tracking.open_date) (или любой необнуляемый столбец в пределах tracking; не важно, какой именно).

1 голос
/ 07 марта 2011

COUNT(*) подсчитывает количество строк, приведенных в запросе.

Вы можете использовать count(tracking.open_date), практически любой столбец из таблицы отслеживания (правая таблица)

0 голосов
/ 07 марта 2011

Проблема заключается в том, что первый запрос выполнит внешнее соединение, причем некоторые строки содержат NULL во всех таблицах из таблицы отслеживания. Затем он применяет фильтр к этим столбцам отслеживания, и, поскольку они имеют нулевое значение, соответствующая строка из набора результатов будет отфильтрована.

Второй запрос выполнит правильное внешнее объединение для всех столбцов.

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