2

我有一些 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 版本?

非常感谢!

4

3 回答 3

3

您编写查询的方式,编译器认为您想要左连接portfoliotypes,因此它抱怨您的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
于 2010-04-19T15:48:57.603 回答
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页面也有更详细的解释,搜索“以前的逗号运算符(,)”

于 2010-04-19T16:01:21.290 回答
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
于 2010-04-19T15:50:19.280 回答