MySQL“ON 子句中的未知列”错误:综合解决方案
在 MySQL 中遇到“‘ON 子句’中的未知列‘columnName’”错误可能会令人沮丧。当联接操作引用数据库找不到的列时,会出现此错误。让我们剖析一下原因并提供解决方案。
该错误通常表示连接语法存在问题。 让我们看一下示例查询:
<code class="language-sql">SELECT p.*, IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted, pm.MediaID, DATE_FORMAT(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom', AsText(pg.Geometry) AS Geometry FROM property p, propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216 LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1 WHERE p.paused = 0 AND p.PropertyGeometryID = pg.id GROUP BY p.id</code>
这里的核心问题是连接样式的混合:逗号分隔连接 (property p, propertygeometry pg
) 是较旧的 ANSI-89 样式,而后续连接使用现代 ANSI-92 JOIN
语法。 连接样式的这种不一致会导致意外的行为和错误。
ANSI-89(逗号)与 ANSI-92 (JOIN
) 加入
MySQL 支持 ANSI-89(逗号样式)和 ANSI-92(JOIN
关键字)连接。 然而,它们的优先级不同,导致混合使用出现问题。 JOIN
关键字具有较高的优先级,与逗号连接结合使用时,会导致数据库错误解释表之间的关系。
解决方案:一致的 ANSI-92 连接
要解决此问题,请对查询中的所有联接一致使用 ANSI-92 JOIN
语法。 这是更正后的版本:
<code class="language-sql">SELECT p.*, IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted, pm.MediaID, DATE_FORMAT(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom', AsText(pg.Geometry) AS Geometry FROM property p JOIN propertygeometry pg ON p.PropertyGeometryID = pg.id JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216 LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1 WHERE p.paused = 0 GROUP BY p.id</code>
通过使用统一的 JOIN
语法,可以消除歧义并确保数据库正确解释连接条件,从而解决“ON 子句中的未知列”错误。 这种方法可以促进更清晰、更易于维护的 SQL 代码。
以上是为什么我的 MySQL 查询会产生'ON 子句中的未知列”错误,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!