Rumah >pangkalan data >tutorial mysql >FIND_IN_SET() lwn. IN(): Mengapa Seseorang Mengembalikan Semua Keputusan Manakala Yang Lain Hanya Mengembalikan Yang Pertama?
FIND_IN_SET() vs IN(): Memahami Percanggahan dalam Keputusan Pertanyaan
Apabila menanyakan pangkalan data hubungan, adalah perlu untuk memahami perbezaan antara fungsi FIND_IN_SET() dan IN(). Artikel ini mengkaji tingkah laku mereka dalam senario pangkalan data tertentu.
Masalah:
Pertimbangkan dua jadual: pesanan dan syarikat. Jadual pesanan termasuk lajurCompanyIDs yang dilampirkan yang mengandungi senarai ID syarikat yang dipisahkan koma. Jadual syarikat mengandungi nama syarikat sebenar. Apabila melakukan pertanyaan untuk mendapatkan semula nama syarikat yang dikaitkan dengan pesanan menggunakan fungsi FIND_IN_SET(), ia mengembalikan semua hasil yang dijangkakan. Walau bagaimanapun, menggantikan FIND_IN_SET() dengan IN() dalam pertanyaan hanya mengembalikan nama syarikat yang pertama.
Punca:
Fungsi IN() mentafsirkan attachedCompanyIDs sebagai satu integer, manakala FIND_IN_SET() menganggapnya sebagai rentetan. Apabila attachedCompanyIDs dibuang sebagai integer, ia hanya mengekalkan digit sehingga aksara bukan angka pertama (koma). Akibatnya, pertanyaan IN() hanya mengembalikan syarikat yang dikaitkan dengan nombor pertama dalam senarai dipisahkan koma.
Penyelesaian:
Untuk memintas isu ini, PostgreSQL menawarkan penyelesaian yang lebih mantap:
SELECT name FROM orders JOIN company ON companyID = ANY(('{' || attachedCompanyIDs || '}')::INT[]) WHERE orderID = 1;
Pertanyaan ini memanfaatkan ANY() berfungsi untuk menghantar attachedCompanyIDs sebagai tatasusunan, membolehkan penggunaan indeks yang berkesan pada companyID.
Kemas kini:
Untuk pangkalan data MySQL, yang tidak mempunyai sokongan tatasusunan, pendekatan alternatif boleh digunakan:
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);
Pertanyaan ini berulang melalui kedudukan berpotensi, mengekstrak subrentetan daripada attachedCompanyIDs untuk memadankan companyID. Ia melibatkan berbilang gabungan, tetapi ia tetap berfungsi untuk senario dengan bilangan ID syarikat yang terhad dalam senarai dipisahkan koma.
Atas ialah kandungan terperinci FIND_IN_SET() lwn. IN(): Mengapa Seseorang Mengembalikan Semua Keputusan Manakala Yang Lain Hanya Mengembalikan Yang Pertama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!