首页 > 数据库 > mysql教程 > 为什么我的 MySQL 查询会产生'ON 子句中的未知列”错误,如何修复它?

为什么我的 MySQL 查询会产生'ON 子句中的未知列”错误,如何修复它?

DDD
发布: 2025-01-13 07:04:41
原创
710 人浏览过

Why Does My MySQL Query Produce an

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板