mysql - 为什么这个 "nested join"适用于 PDO 但不适用于 MySql cli?

标签 mysql sql join pdo

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

没有抛出任何错误,更奇怪的是,我得到的结果实际上与查询应该执行的操作一致。

最佳答案

这是有效的 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 应该仅仅被视为一种娱乐。不要嵌套 JOIN。在下一个表/子查询引用之前,每个 JOIN 都应该跟在它自己的 ON 子句之后。嵌套连接使代码更难理解。它可能会引入错误(我认为在这种情况下发生过)。也可能存在微妙的边缘情况,在这些情况下,要弄清楚正在发生的事情有点困难。

关于mysql - 为什么这个 "nested join"适用于 PDO 但不适用于 MySql cli?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54094672/

相关文章:

mysql - 按 id 排序时非常慢,但按时间戳、id 排序时速度很快

php - PHP 与 MySQL 中的资源 id #6 错误

mysql - 如何创建MySQL分层递归查询

mysql - 使用 fk 连接两个表中的数据

mysql - Redshift - SQL Left Join 不适用于相关子查询和聚合函数

mysql - 如何为特定数据库模式设置 MariaDB 以从 mysql 服务器复制

mysql - 检查计数中的唯一值,但获取所有结果

php - 谁能给我一些基本的 XSS 和 sql 注入(inject)脚本? (不是它看起来的那样)

java - Hibernate 在内部使用什么类来格式化 SQL 输出?

database - 在数据库中存储问卷的有效方法是什么?