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中文網其他相關文章!