Mysql Puzzle: условия в ON и ГДЕ - PullRequest
       1

Mysql Puzzle: условия в ON и ГДЕ

1 голос
/ 28 сентября 2011

Следующие два запроса не возвращают одинаковый результат.Почему?

Примечание : Я нашел этот вопрос как загадку Mysql, у меня нет больше данных по этому вопросу?

SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id 
AND table2.val < 5


SELECT table1.*
FROM table1 LEFT JOIN table2
ON table2.table1_id = table1.id 
WHERE table2.val < 5

Ответы [ 4 ]

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

Левое внешнее соединение вернет строки (с нулевыми столбцами из таблицы2, если они были выбраны), когда условие не выполнено, тогда как WHERE их отфильтровывает.

3 голосов
/ 28 сентября 2011

Первый запрос вернет все строки из таблицы 1. LEFT JOIN всегда возвращает все строки из левой таблицы независимо от того, что вы пишете в условии соединения (однако он может дублировать строки, если есть несколько совпадений, но так как вы присоединение к полю с именем id, это, скорее всего, уникальный ключ, поэтому дубликатов не будет).

Второй запрос вернет только те строки из таблицы 1 , где соответствующая строка в таблице2 имеет val < 5. На самом деле вы могли бы написать INNER JOIN здесь вместо LEFT JOIN, потому что строки, в которых не удалось соединиться, не будут в результирующем наборе в любом случае из-за предложения WHERE.

1 голос
/ 28 сентября 2011

Первый запрос включается только если table2.val < 5. Второй фильтрует даже строки таблицы. Идентичный результат должен быть получен, если вместо этого вы используете INNER JOIN.

0 голосов
/ 28 сентября 2011

Попытка думать как " компилятор " посмотрите в скобках ...

SELECT     table1.*
FROM       table1 
LEFT JOIN  table2 ON (
             table2.table1_id = table1.id 
             AND table2.val < 5
)

В этом примере выполняется СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ 2 таблиц при выполнении условияtable2.table1_id = table1.id AND table2.val < 5 имеет значение true.

SELECT     table1.*
FROM       table1
LEFT JOIN  table2 ON ( table2.table1_id = table1.id )
WHERE      (table2.val < 5)

В этом примере выполняется СЛЕВОЕ СОЕДИНЕНИЕ, когда применяется условие table2.table1_id = table1.id, а затем получают строки результата table1 LEFT JOIN table2 ON ( table2.table1_id = table1.id ) ГДЕ условие table2.val < 5 является истинным

...