Почему это «вложенное соединение» работает с PDO, а не с MySql cli? - PullRequest
0 голосов
/ 08 января 2019

Я не понимаю, почему этот запрос работает и что он на самом деле означает. Следует отметить, что этот запрос работает при использовании PDO, но не через Mysql cli или даже phpmyadmin.

   SELECT table1.something, table2.something 
   FROM someTable
   LEFT JOIN table 1
     INNER JOIN table2
       ON table2.table1_id = table1.id
     ON table1.account_id = someTable.account_id

Никаких ошибок не возникает, и, что еще более странно, у меня действительно есть результаты, которые согласуются с тем, что должен делать запрос.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Существует два варианта синтаксиса в стандартном SQL для написания нескольких объединений, общий:

a join b on ... join c on ... join d on ...

и странный:

a join b join c join d on ... on ... on ...

В обоих случаях первое ON обрабатывается первым, что означает, что странный синтаксис объединяет первую таблицу в последнем ON и последнюю таблицу в первом ON, за которой действительно трудно следовать. Вот почему его почти никто не использует (но некоторые инструменты могут его создать)

Чтобы изменить свой странный

SELECT table1.something, table2.something 
FROM someTable
LEFT JOIN table1
  INNER JOIN table2 bbm
  ON table2.table1_id = table1.id
ON table1.account_id = someTable.account_id

к общему перемещает последнее ВКЛ после первого соединения:

SELECT table1.something, table2.something 
FROM someTable
LEFT JOIN table1
  ON table1.account_id = someTable.account_id
INNER JOIN table2 bbm
  ON table2.table1_id = table1.id
0 голосов
/ 08 января 2019

Это допустимый синтаксис SQL, если вы только что взяли фрагмент из предложения FROM. Это интерпретируется как:

SELECT table1.something, table2.something
FROM someTable
LEFT JOIN
(table1 INNER JOIN
 table2 bbm
 ON table2.table1_id = table1.id
)
ON table1.account_id = table2.account_id

Тем не менее, это действительно тайна, потому что псевдоним переименовывает table2 в bbm, что не используется. Условия ON относятся только к предыдущим таблицам. В результате получается странная форма CROSS JOIN.

То, что вы можете вкладывать JOIN s таким образом, должно, на мой взгляд, просто рассматриваться как развлечение. Не вкладывайте JOIN с. За каждым JOIN должно следовать собственное предложение ON перед следующей ссылкой на таблицу / подзапрос. Вложенные объединения затрудняют понимание кода. Это может привести к ошибкам (что, я думаю, произошло в этом случае). Также могут быть тонкие крайние случаи, когда немного сложно понять, что происходит.

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