sql—为什么这种“嵌套联接”可以与pdo一起使用,而不能与mysql cli一起使用?

mzsu5hc0  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(280)

我不明白为什么这个查询有效,它实际上意味着什么。应该注意的是,这个查询在使用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

没有抛出错误,更奇怪的是,我实际上得到了与查询应该做的事情一致的结果。

pdtvr36n

pdtvr36n1#

在编写多个联接的标准sql中,有两种语法变体,一种是常见的:

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

奇怪的是:

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

在这两种情况下,first-on都是先处理的,这意味着奇怪的语法将last-on中的第一个表和first-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
z0qdvdin

z0qdvdin2#

这是有效的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

也就是说,这真的很神秘,因为别名会重命名 table2bbm ,未使用。这个 ON 条件仅引用前面的表。结果是某种奇怪的 CROSS JOIN .
你可以筑巢 JOIN 在我看来,这种方式应该仅仅被看作是一种娱乐。不要筑巢 JOIN s。每个 JOIN 应该紧随其后 ON 子句,在下一个表/子查询引用之前。嵌套联接使代码更难理解。它可能会引入错误(我认为在本例中就是这样)。也可能存在一些微妙的边缘情况,在这些情况下,弄清楚正在发生的事情有点困难。

相关问题