Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan MySQL Saya Menghasilkan Ralat 'Lajur tidak diketahui dalam klausa ON', dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Pertanyaan MySQL Saya Menghasilkan Ralat 'Lajur tidak diketahui dalam klausa ON', dan Bagaimana Saya Boleh Membetulkannya?

DDD
DDDasal
2025-01-13 07:04:41710semak imbas

Why Does My MySQL Query Produce an

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn