MySQL LEFT JOIN错误

时间:2010-04-19 15:45:40

标签: sql mysql mysql-error-1054

我有一些SQL用于使用较旧的MySQL版本,但在升级到较新的MySQL 5版本后,我收到了一个错误。这是SQL:

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版本?

非常感谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您需要使用INNER 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等等。如果   你将逗号连接与另一个混合   有连接时连接类型   条件,形式的错误   'on中的未知列'col_name'   条款'可能会发生。相关信息   处理这个问题   在本节后面。

关于MySQL页面还有更详细的解释,搜索“以前,逗号运算符(,)”

答案 2 :(得分:0)

如果您的projectID列确实存在,并且没有拼写错误,请尝试将其更改为


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