Ну, это порядок операций ..
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
ON t2.table2_ID = t1.table1_ID
можно переписать в виде:
SELECT
t1.*
FROM
table1 t1 -- inner join t1
INNER JOIN
(table2 t2 LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID) -- with this
ON t2.table2_ID = t1.table1_ID -- on this condition
так в основном, сначала вы LEFT JOIN t2 t3 с, на основе условия соединения: table3_ID = table2_ID, то вы INNER JOIN t1 с t2 на table2_ID = table1_ID.
В вашем втором примере вы сначала INNER JOIN t1 с t2, а затем LEFT JOIN получившееся внутреннее соединение с таблицей t3 в условии table2_ID = table1_ID.
SELECT
t1.*
FROM
table1 t1
INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID
LEFT JOIN table3 t3 ON t3.table3_ID = t2.table2_ID
можно переписать в виде:
SELECT
t1.*
FROM
(table1 t1 INNER JOIN table2 t2 ON t2.table2_ID = t1.table1_ID) -- first inner join
LEFT JOIN -- then left join
table3 t3 ON t3.table3_ID = t2.table2_ID -- the result with this
EDIT
Я извиняюсь. Мое первое замечание было неправильным. Эти два запроса будут давать одни и те же результаты, но может быть разница в производительности, поскольку первый запрос может выполняться медленнее второго запроса в некоторых случаях (когда таблица 1 содержит только подмножество элементов в таблице 2), поскольку LEFT JOIN будет выполняться сначала - и только затем пересекается с таблицей 1. В отличие от второго запроса, который позволяет оптимизатору запросов выполнять свою работу.
Получают ли они тот же результат при их исполнении? –
+1 за то, что заставило меня пойти «Хм ...» – Tomalak
. Лучше понять второй, чем первый, даже если вы положили (parens) вокруг LOJ в первом. С нетерпением ждем хорошего ответа на этот вопрос. –