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