2010-04-19 128 views
2

我有一些SQL用於使用舊的MySQL版本,但升級到較新的MySQL 5版本後,出現錯誤。這裏的SQL:MySQL LEFT JOIN錯誤

SELECT portfolio.*, projects.*, types.* 
FROM projects, types 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE projects.projectType = types.typeID AND types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 

和新的錯誤我收到:

Unknown column 'projects.projectID' in 'on clause' 

我怎樣才能將它轉換爲兼容SQL爲新的MySQL版本?

非常感謝!

+0

信息化:http://www.newtonslore.com/2008/10/08/mysql -unknown-column-in-on-clause-error/ – 2010-04-19 15:54:24

回答

2

你需要重寫內部採用查詢JOIN代替逗號運算符:

SELECT portfolio.*, projects.*, types.* 
FROM projects 
INNER JOIN types 
ON projects.projectType = types.typeID 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 

說明:

這與MySQL更改運算符優先級以符合ANSI標準有關。檢查出的MySQL文檔:http://dev.mysql.com/doc/refman/5.1/en/join.html

INNER JOIN和,(逗號)是 中的連接條件沒有 語義上等價的:既產生 指定的表之間的 笛卡爾乘積(即,每個和 第一個表中的每一行都將 連接到第二個 表中的每一行)。

但是,逗號 運算符的優先級小於INNER JOIN, CROSS JOIN,LEFT JOIN等。如果您 混合逗號連接與其他 連接類型時,有一個加盟 條件,形式 未知列在「關於 條款」「COL_NAME」的錯誤可能發生。有關處理此問題的 的信息在本節後面給出 。

還有MySQL的網頁上更詳細的解釋,搜索 「以前,逗號(,)」

+0

感謝您的幫助和包含的解釋。 – Alex 2010-04-19 16:09:25

+0

沒問題。只需補充一點,這個改變是在MySQL 5.0.12中進行的。 – Janci 2010-04-19 16:20:54

3

您編寫查詢的方式,編譯器認爲您想要將portfolio加入types,因此它抱怨說您的on子句引用了projects表。

試試這個ANSI風格的版本:

SELECT * 
FROM projects p 
inner join types t on p.projectType = t.typeID AND t.typeID = #URL.a# 
LEFT JOIN portfolio pf ON pf.pfProjectID = p.projectID 
ORDER BY t.typeSort, p.projectPriority 
+0

謝謝你們,都是工作解決方案。非常感激! – Alex 2010-04-19 16:03:36

0

如果你的專案編號列確實存在,而且也沒有錯字,試圖改變這


SELECT portfolio.*, projects.*, types.* 
FROM projects 
INNER JOIN types ON projects.projectType = types.typeID 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 
+0

謝謝你們,都是工作解決方案。非常感激! – Alex 2010-04-19 16:02:56

+0

雖然這個答案可以解決問題,但它並不能解釋爲什麼問題首先發生。 Janci的回答如下,這就是爲什麼我低估了這一點,並提高了他的評價。 – 2010-04-19 16:05:33

+0

你是對的,這是有道理的。我已更改指標以標記該帖子。 – Alex 2010-04-19 16:08:22