我不明白为什么这个查询有效,它实际上意味着什么。应该注意的是,这个查询在使用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条答案
按热度按时间pdtvr36n1#
在编写多个联接的标准sql中,有两种语法变体,一种是常见的:
奇怪的是:
在这两种情况下,first-on都是先处理的,这意味着奇怪的语法将last-on中的第一个表和first-on中的最后一个表连接起来,这很难理解。这就是为什么几乎没有人在使用它(但有些工具可能会创建它)
改变你的奇怪
对于公共连接,请在第一个连接后移动最后一个:
z0qdvdin2#
这是有效的sql语法,假设您刚刚从
FROM
条款。它被解释为:也就是说,这真的很神秘,因为别名会重命名
table2
至bbm
,未使用。这个ON
条件仅引用前面的表。结果是某种奇怪的CROSS JOIN
.你可以筑巢
JOIN
在我看来,这种方式应该仅仅被看作是一种娱乐。不要筑巢JOIN
s。每个JOIN
应该紧随其后ON
子句,在下一个表/子查询引用之前。嵌套联接使代码更难理解。它可能会引入错误(我认为在本例中就是这样)。也可能存在一些微妙的边缘情况,在这些情况下,弄清楚正在发生的事情有点困难。