Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Memilih Rekod dengan Cekap dengan Keadaan Berbilang Di Mana pada Lajur yang Sama dalam SQL?
Kemahiran pertanyaan SQL: menapis rekod yang mengandungi berbilang keadaan dengan cekap dalam lajur yang sama
Dalam pangkalan data SQL, mendapatkan semula rekod berdasarkan syarat tertentu kelihatan mudah, tetapi apabila lajur yang sama mengandungi berbilang syarat, pemilihan rekod yang memenuhi keperluan menjadi satu cabaran dengan cekap.
Contoh: Katakan terdapat jadual yang mengandungi tiga lajur: ID, contactid dan bendera. Pertanyaan berikut direka untuk mengembalikan nilai contactid yang dikaitkan dengan kedua-dua teg 'Sukarelawan' dan 'Muat naik':
<code class="language-sql">SELECT contactid WHERE flag = 'Volunteer' AND flag = 'Uploaded'...</code>
Walau bagaimanapun, pertanyaan ini mengembalikan set hasil kosong. Sebabnya terletak pada tafsiran logik pertanyaan: ia cuba mencari rekod dengan bendera sama dengan 'Sukarelawan' dan 'Muat naik', yang mustahil kerana setiap rekod hanya boleh mempunyai satu nilai bendera.
Untuk menyelesaikan masalah ini, kami mempunyai dua penyelesaian yang boleh dilaksanakan:
Pilihan 1: Gunakan GROUP BY dan HAVING
Kaedah ini bergantung pada mengumpulkan hasil dengan contactid dan kemudian menggunakan klausa HAVING untuk menentukan bilangan teg yang sepadan. Contohnya, untuk memadankan teg 'Sukarelawan' dan 'Muat naik', anda akan menggunakan pertanyaan berikut:
<code class="language-sql">SELECT contact_id FROM your_table WHERE flag IN ('Volunteer', 'Uploaded', ...) GROUP BY contact_id HAVING COUNT(*) = 2 -- // 必须与 WHERE flag IN (...) 列表中的数量匹配</code>
Pilihan 2: Gunakan JOIN
Di sini, kami menggunakan JOIN untuk mewujudkan hubungan antara rekod berdasarkan nilai biasa. Pertimbangkan pertanyaan berikut:
<code class="language-sql">SELECT T1.contact_id FROM your_table T1 JOIN your_table T2 ON T1.contact_id = T2.contact_id AND T2.flag = 'Uploaded' -- // 如果需要,可以添加更多 JOIN WHERE T1.flag = 'Volunteer'</code>
Pertanyaan ini menyertai jadual itu sendiri pada lajur contactid, mewujudkan berbilang pautan. Klausa WHERE memastikan bahawa contactid awal memenuhi syarat bendera pertama ('Sukarelawan'), dan sambungan ke T2 mengesahkan bahawa contactid yang sama juga memenuhi syarat bendera kedua ('Dimuat naik').
Pilihan mana yang dipilih bergantung pada saiz senarai tag dan kekerapan jangkaan padanan. Jika terdapat banyak teg dan sedikit padanan, pertanyaan menggunakan GROUP BY dan HAVING mungkin lebih cekap. Untuk kes di mana senarai teg adalah kecil dan padanan yang kerap, kaedah berasaskan JOIN cenderung menunjukkan prestasi yang lebih baik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memilih Rekod dengan Cekap dengan Keadaan Berbilang Di Mana pada Lajur yang Sama dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!