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