Ralat "lajur tidak diketahui" dalam pertanyaan MySQL
Dalam MySQL, anda mungkin menghadapi ralat "Lajur tidak diketahui 'p.id' dalam klausa ON" semasa melaksanakan pertanyaan yang melibatkan gabungan. Untuk memahami punca ralat ini, mari kita mendalami pertanyaan dan tafsiran pangkalan datanya.
Penjelasan pertanyaan:
Pertanyaan yang dipersoalkan kelihatan seperti ini:
<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>
Ralat ini disebabkan oleh pencampuran gaya ANSI-89 dan ANSI-92, yang boleh membawa kepada kekaburan. Dalam sintaks ANSI-89, cantuman diwakili dengan koma, manakala dalam ANSI-92, kata kunci JOIN digunakan.
Perihalan ralat:
Pangkalan data mentafsir pertanyaan seperti berikut:
<code class="language-sql">FROM property p, ( propertygeometry pg JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216 ... )</code>
Dalam tafsiran ini, jadual p tidak diisytiharkan sebelum cantuman dipisahkan koma dengan propertygeometry ms. Oleh itu, pangkalan data tidak dapat mencari lajur p.id semasa menilai keadaan ON dalam cantuman seterusnya.
Penyelesaian:
Untuk mengatasi ralat ini, adalah disyorkan untuk sentiasa menggunakan gabungan gaya ANSI-92, di mana semua gabungan dibuat secara eksplisit oleh kata kunci 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>
Dengan menggunakan sintaks gabungan yang konsisten, anda boleh mengelakkan kekaburan dan menghalang ralat yang serupa dalam pertanyaan akan datang.
Atas ialah kandungan terperinci Mengapa saya mendapat ralat 'Lajur tidak diketahui 'p.id' dalam 'pada klausa'' dalam pertanyaan MySQL saya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!