Rumah >pangkalan data >tutorial mysql >FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap Fungsi untuk Pertanyaan Berbilang Jadual?
FIND_IN_SET() vs IN(): Memahami Perbezaan Pertanyaan
Apabila menanyakan data daripada berbilang jadual, adalah penting untuk memahami cara sintaks anda penggunaan mempengaruhi keputusan. Pertimbangkan situasi berikut:
Anda mempunyai dua meja, satu untuk pesanan dan satu untuk syarikat. Jadual pesanan mengandungi lajurCompanyIDs yang dilampirkan dengan ID syarikat yang dipisahkan koma dan jadual syarikat mengandungi ID Syarikat dan lajur nama.
Pertanyaan dengan FIND_IN_SET()
Pertanyaan di bawah membolehkan anda mendapatkan semula semua nama syarikat yang dikaitkan dengan yang tertentu pesanan:
SELECT name FROM orders, company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Pertanyaan ini berjaya mengembalikan semua nama syarikat: Syarikat 1, Syarikat Lain dan StackOverflow.
Pertanyaan dengan IN()
Walau bagaimanapun, jika anda mengubah suai pertanyaan sedikit dengan menggantikan FIND_IN_SET() dengan IN(), hasilnya change:
SELECT name FROM orders, company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Dalam kes ini, pertanyaan hanya mengembalikan nama syarikat pertama yang disenaraikan dalam lajurCompanyIDs yang dilampirkan: Syarikat 1.
Memahami Perbezaan
Punca perbezaan ini terletak pada cara kedua-dua fungsi ini menangani ID Syarikat yang dilampirkan lajur.
Isu Potensi dengan IN()
Dalam contoh pangkalan data anda, attachedCompanyIDs disimpan sebagai rentetan . Apabila digunakan dalam fungsi IN(), ia secara automatik dihantar ke integer. Walau bagaimanapun, pemutus ini hanya mengambil kira digit pertama sebelum koma. Oleh itu, hanya ID syarikat pertama dalam senarai ID Syarikat yang dilampirkan dipertimbangkan.
Penyelesaian Kemungkinan
Gunakan pertanyaan yang lebih lanjut: Jika anda mempunyai bilangan nilai yang terhad dalam lajur attachedCompanyIDs, anda boleh menggunakan pertanyaan yang lebih kompleks seperti ini:
SELECT name FROM orders CROSS JOIN ( SELECT 1 AS pos UNION ALL SELECT 2 AS pos UNION ALL SELECT 3 AS pos UNION ALL SELECT 4 AS pos UNION ALL SELECT 5 AS pos ) q JOIN company ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
Ini pertanyaan mengekstrak ID syarikat individu daripada rentetan attachedCompanyIDs menggunakan fungsi SUBSTRING_INDEX().
Atas ialah kandungan terperinci FIND_IN_SET() lwn. IN(): Bilakah Saya Harus Menggunakan Setiap Fungsi untuk Pertanyaan Berbilang Jadual?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!