首頁 >資料庫 >mysql教程 >為什麼我的 MySQL 查詢會產生「ON 子句中的未知列」錯誤,如何修復它?

為什麼我的 MySQL 查詢會產生「ON 子句中的未知列」錯誤,如何修復它?

DDD
DDD原創
2025-01-13 07:04:41751瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn