我有一些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版本?
非常感谢!
答案 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