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() lwn. IN(): Mengapa Seseorang Mengembalikan Semua Keputusan Manakala Yang Lain Hanya Mengembalikan Yang Pertama?

Linda Hamilton
Linda Hamiltonasal
2024-12-11 20:46:13936semak imbas

FIND_IN_SET() vs. IN(): Why Does One Return All Results While the Other Only Returns the First?

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!

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