资讯专栏INFORMATION COLUMN

SQL操作符的优先级引起的(MySQL unknown column in ON clause)

XUI / 2163人阅读

摘要:问题症状就是,一个看似很正常的语句在执行的时候,老是提示但是那个字段明明就一直存在。解决办法就是不要使用逗号操作符来进行连表查询,上面的语句应该修改成为


近期在修改一个很老的项目(大概是8年前的代码了),运行环境必须是php5.2才可以,5.3就会有很多报错,然后数据库用的是mysql4.4,这个数据库太老了,我想sql这个语言抽象度很高,应该不会出现兼容性问题的,于是在本地搭建开发环境的时候就直接在mysql5.5上运行,然而,还是我太单纯了,想的太美好,系统是可以顺利运行,但是总有几个功能运行时报sql语句错误。

问题症状就是,一个看似很正常的SQL语句在执行的时候,老是提示 "MySQL unknown column in ON clause" 但是那个字段明明就一直存在。

搞了半天,在各种地方查资料,都没有找到解决方法,最后在stackoverflow上根据关键字排查,最终找到了有用的问题信息。具体的问题链接参考 http://stackoverflow.com/questions/4065985/mysql-unknown-column-in-on-clause?rq=1

问题的原因就是ANSI-89的规范和ANSI-92的规范混用导致的。也就是说在进行多表联合查询的时候要避免这种写法 SELECT xx FORM table1, table2 join table3 on table1.xx = table2.xx .... 出现这种情况就会报错,具体的原因是因为操作符的优先级不同导致的,逗号的优先级要比join的优先级要低,因此上面的语句实际的效果相当于是这样 SELECT xx FORM table1, (table2 join table3 on table1.xx = table2.xx ....) ,注意括号里面的语句,因为优先级较高所以先解析,而这时候是找不到table1的字段的,因此就会出现 unknown column in ON clause 的错误。解决办法就是不要使用逗号操作符来进行连表查询,上面的语句应该修改成为 SELECT xx FORM table1 join table2 on table1.id = table2.id join table3 on table1.xx = table2.xx ....

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/46420.html

相关文章

  • SQL作符先级引起(MySQL unknown column in ON clause)

    摘要:问题症状就是,一个看似很正常的语句在执行的时候,老是提示但是那个字段明明就一直存在。解决办法就是不要使用逗号操作符来进行连表查询,上面的语句应该修改成为 近期在修改一个很老的项目(大概是8年前的代码了),运行环境必须是php5.2才可以,5.3就会有很多报错,然后数据库用的是mysql4.4,这个数据库太老了,我想sql这个语言抽象度很高,应该不会出现兼容性问题的,于是在本地搭建开发...

    andot 评论0 收藏0
  • Mysql Documentation 学习笔记: JOIN

    摘要:第二条也不难理解拿上面的语句来说告诉以这个条件去连接表,的执行过程就稍微不一样,前面提到过如果不指定条件的话,结果是两个表的笛卡尔积,然后再去笛卡尔积中匹配成立的条件。 JOIN Basic In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other...

    NicolasHe 评论0 收藏0
  • Mysql Documentation 学习笔记: JOIN

    摘要:第二条也不难理解拿上面的语句来说告诉以这个条件去连接表,的执行过程就稍微不一样,前面提到过如果不指定条件的话,结果是两个表的笛卡尔积,然后再去笛卡尔积中匹配成立的条件。 JOIN Basic In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other...

    caoym 评论0 收藏0
  • 后端相关技能(一):数据库

    摘要:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制在严格模式下,不允许日期和月份为零设置该值,数据库不允许插入零日期,插入零日期会抛出错误而不是警告。在或过程中,如果数据被零除,则产生错误而非警告。 预期学习目标 书:高性能Mysql 熟练sql语句 Mysql调优 数据库的配置 主从数据库 项目实战分库分表 学习笔记 读写分离 设置 特殊配置 sq...

    cyixlq 评论0 收藏0
  • MySQL sql_mode 说明(及处理一起 sql_mode 引发问题)

    摘要:常用值说明官方手册专门有一节介绍。定义了两个方面应支持的语法,以及应该在数据上执行何种确认检查。数据检查类认为日期非法,与是否设置后面的严格模式有关。认为,相比直接报错终止,数据不一致问题更严重。 1. MySQL 莫名变成了 Strict SQL Mode 最近测试组那边反应数据库部分写入失败,app层提示是插入成功,但表里面里面没有产生数据,而两个写入操作的另外一个表有数据。因为 ...

    phodal 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<