MySQL: разные результаты с оператором WHERE, включенным в запрос master-detail? - PullRequest
1 голос
/ 24 июля 2011

Допустим, у меня есть мастер-таблица (таблица1) с подробным описанием (таблица2). Для каждой основной записи может быть несколько подробных записей. Теперь я хочу запрос, который подсчитывает все подробные записи для каждой основной записи:

SELECT t1.id, count(t2.*)
FROM table1 as t1
LEFT JOIN table2 AS t2 ON t2.id=t1.id
GROUP BY t1.id

Это дает мне ровно столько же записей, сколько в таблице 1.

Но когда я добавляю оператор WHERE для подсчета только тех записей, у которых контрольное поле больше 0, я больше не получаю все записи в таблице1! Те, у которых нет соответствующих подробных записей, теперь полностью исключены. Почему это происходит?

SELECT t1.id, count(t2.*)
FROM table1 as t1
LEFT JOIN table2 AS t2 ON t2.id=t1.id
WHERE t2.checkfield != 0
GROUP BY t1.id

(Возможно, что-то еще не так в моем реальном запросе, поскольку я попытался упростить это для этого примера, но я думаю, что понял правильно)

1 Ответ

0 голосов
/ 24 июля 2011

Предложение WHERE ограничивает объединяемые результаты, по которым агрегируются, поэтому, пока вы пытаетесь выполнить внешнее объединение, выживают только те строки с t2.checkfield != 0, но это исключает все несопоставленные строки!

С другой стороны, когда вы изменяете WHERE на AND, у вас теперь есть tab1 LEFT OUTER JOIN tab2 ON(tab1.id = tab2.t1_id AND some_condition) - но это все еще внешнее соединение, т.е. будут включены записи слева, которые не имеют совпадения справа.

...