Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan MySQL Saya Menghasilkan Ralat 'Lajur tidak diketahui dalam klausa ON', dan Bagaimana Saya Boleh Membetulkannya?
MySQL "Lajur tidak diketahui dalam klausa ON" Ralat: Penyelesaian Komprehensif
Menemui ralat "Nama ruangan tidak diketahui dalam 'fasal ON'" dalam MySQL boleh mengecewakan. Ralat ini timbul apabila operasi gabungan merujuk lajur yang tidak dapat ditemui oleh pangkalan data. Mari kita rungkai punca dan berikan penyelesaian.
Ralat biasanya menunjukkan masalah dengan sintaks gabungan. Mari kita periksa contoh pertanyaan:
<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>
Isu teras di sini ialah gabungan gaya cantuman: cantuman dipisahkan koma (property p, propertygeometry pg
) ialah gaya ANSI-89 yang lebih lama, manakala cantuman seterusnya menggunakan sintaks ANSI-92 JOIN
moden. Ketidakkonsistenan dalam gaya bergabung ini membawa kepada tingkah laku yang tidak dijangka dan ralat.
ANSI-89 (Koma) lwn. ANSI-92 (JOIN
) Menyertai
MySQL menyokong gabungan ANSI-89 (gaya koma) dan ANSI-92 (JOIN
). Walau bagaimanapun, mereka berbeza dalam keutamaan, menjadikan penggunaan campuran bermasalah. Kata kunci JOIN
mempunyai keutamaan yang lebih tinggi, menyebabkan pangkalan data salah mentafsir hubungan antara jadual apabila digabungkan dengan cantuman koma.
Penyelesaian: Gabungan ANSI-92 yang Konsisten
Untuk menyelesaikan masalah ini, gunakan sintaks ANSI-92 JOIN
secara konsisten untuk semua gabungan dalam pertanyaan anda. Berikut ialah versi yang diperbetulkan:
<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 JOIN
seragam, anda menghapuskan kekaburan dan memastikan pangkalan data mentafsirkan syarat gabungan dengan betul, menyelesaikan ralat "Lajur tidak diketahui dalam klausa ON". Pendekatan ini menggalakkan kod SQL yang lebih jelas dan boleh diselenggara.
Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL Saya Menghasilkan Ralat 'Lajur tidak diketahui dalam klausa ON', dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!