首页 >数据库 >mysql教程 >为什么我的 MySQL 查询中出现''on 子句'中的未知列'p.id'”错误?

为什么我的 MySQL 查询中出现''on 子句'中的未知列'p.id'”错误?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-13 09:58:43134浏览

Why am I getting an

MySQL 查询中的“未知列”错误

在 MySQL 中,执行涉及联接的查询时,可能会遇到“ON 子句中未知列 'p.id'”错误。为了理解此错误的原因,让我们深入研究查询及其数据库解释。

查询解释:

有问题的查询如下所示:

<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>

此错误是由于混合使用了 ANSI-89 和 ANSI-92 风格的联接,这可能导致歧义。在 ANSI-89 语法中,联接用逗号表示,而在 ANSI-92 中,使用 JOIN 关键字。

错误说明:

数据库对查询的解释如下:

<code class="language-sql">FROM property p, (
    propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    ...
)</code>

在这种解释中,表 p 在与 propertygeometry pg 的逗号分隔联接之前没有声明。因此,在评估后续联接中的 ON 条件时,数据库无法找到列 p.id。

解决方案:

为了解决此错误,建议始终使用 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>

通过采用一致的联接语法,您可以避免歧义并防止将来查询中出现类似的错误。

以上是为什么我的 MySQL 查询中出现''on 子句'中的未知列'p.id'”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn