Masalah:
Tentukan pengguna yang memiliki kedua-dua 'tag1' dan teg 'tag2' sambil mengelakkan kesan penggunaan 'IN,' yang mengembalikan pengguna dengan sama ada tag.
Penyelesaian:
Untuk memilih baris daripada jadual A berdasarkan dua keadaan baris dalam jadual B, pilih salah satu daripada strategi ini:
1. Menguji Baris Berbeza:
SELECT * FROM users WHERE EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag1') AND EXISTS (SELECT * FROM tags WHERE user_id = users.id AND name ='tag2')
SELECT * FROM users WHERE id IN (SELECT user_id FROM tags WHERE name ='tag1') AND id IN (SELECT user_id FROM tags WHERE name ='tag2')
SELECT u.* FROM users u INNER JOIN tags t1 ON u.id = t1.user_id INNER JOIN tags t2 ON u.id = t2.user_id WHERE t1.name = 'tag1' AND t2.name = 'tag2'
2. Mengagregatkan Baris:
SELECT users.id, users.user_name FROM users INNER JOIN tags ON users.id = tags.user_id WHERE tags.name IN ('tag1', 'tag2') GROUP BY users.id, users.user_name HAVING COUNT(*) = 2
SELECT user.id, users.user_name, GROUP_CONCAT(tags.name) as all_tags FROM users INNER JOIN tags ON users.id = tags.user_id GROUP BY users.id, users.user_name HAVING FIND_IN_SET('tag1', all_tags) > 0 AND FIND_IN_SET('tag2', all_tags) > 0
Cadangan:
Untuk kebolehskalaan optimum, pertimbangkan untuk menggunakan COUNT dengan teg dilindungi atau pengagregatan dalaman jika berbilang teg boleh muncul untuk pengguna .
Atas ialah kandungan terperinci Bagaimana untuk Mencari Pengguna dengan Berbilang Teg Dengan Cekap Menggunakan SQL Joins?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!