SQL操做符的優先級引發的(MySQL unknown column in ON clause)


近期在修改一個很老的項目(大概是8年前的代碼了),運行環境必須是php5.2才能夠,5.3就會有不少報錯,而後數據庫用的是mysql4.4,這個數據庫太老了,我想sql這個語言抽象度很高,應該不會出現兼容性問題的,因而在本地搭建開發環境的時候就直接在mysql5.5上運行,然而,仍是我太單純了,想的太美好,系統是能夠順利運行,可是總有幾個功能運行時報sql語句錯誤。php

問題症狀就是,一個看似很正常的SQL語句在執行的時候,總是提示 "MySQL unknown column in ON clause" 可是那個字段明明就一直存在。mysql

搞了半天,在各類地方查資料,都沒有找到解決方法,最後在stackoverflow上根據關鍵字排查,最終找到了有用的問題信息。具體的問題連接參考 http://stackoverflow.com/questions/4065985/mysql-unknown-column-in-on-clause?rq=1sql

問題的緣由就是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 ....數據庫

相關文章
相關標籤/搜索