Find_in_set() vs IN(): Memahami Perbezaan
Dalam MySQL, operator FIND_IN_SET() dan IN() memainkan peranan penting dalam menyoal data daripada jadual. Walaupun kedua-duanya boleh digunakan untuk menguji keahlian dalam satu set nilai, mereka berbeza dalam cara mereka mengendalikan senario tertentu.
Pertimbangkan pertanyaan berikut, yang bertujuan untuk mendapatkan semula nama syarikat yang dikaitkan dengan pesanan:
SELECT name FROM orders, company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Pertanyaan ini berjaya menghasilkan ketiga-tiga nama syarikat: Syarikat 1, Syarikat Lain dan StackOverflow. Walau bagaimanapun, jika kita menggantikan FIND_IN_SET() dengan IN(), hasilnya adalah tidak dijangka:
SELECT name FROM orders, company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Dalam kes ini, hanya nama syarikat pertama, Syarikat 1, dikembalikan. Untuk memahami sebabnya, adalah penting untuk memahami mekanisme asas pengendali ini.
FIND_IN_SET()
FIND_IN_SET() melakukan carian literal untuk nilai tertentu dalam koma -tali yang dipisahkan. Dalam contoh ini, attachedCompanyIDs mengandungi rentetan seperti '1,2,3'. FIND_IN_SET() mengembalikan kedudukan nilai sasaran (1, 2, atau 3) dalam rentetan ini, atau 0 jika tidak ditemui.
IN()
IN (), sebaliknya, menjangkakan senarai nilai untuk dibandingkan dengan nilai sasaran. Walau bagaimanapun, dalam MySQL, attachedCompanyIDs ialah nilai skalar, bukan tatasusunan atau senarai. Oleh itu, MySQL cuba menghantar rentetan skalar ini ke dalam integer (jenis companyID) untuk perbandingan IN().
Semasa penghantaran, MySQL mentafsir koma pertama dalam rentetan ('1,2,3' ) sebagai penghujung bahagian berangka, menghasilkan nilai integer 1. Pada dasarnya, keadaan IN() dengan berkesan menjadi:
companyID IN (1)
Ini menerangkan sebab hanya nama syarikat pertama, Syarikat 1, diambil semula. Keadaan IN() adalah benar hanya untuk nilai pertama dalam rentetan yang dipisahkan koma.
Penyelesaian
Jika andaian menyatakan bahawa bilangan nilai dalam koma -senarai yang dipisahkan adalah terhad, seseorang boleh menggunakan pendekatan alternatif untuk mengendalikan senario sedemikian dengan berkesan.
Atas ialah kandungan terperinci FIND_IN_SET() lwn. IN() dalam MySQL: Bilakah Saya Perlu Menggunakan Setiap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!