2010-04-19 157 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