Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencari Pengguna dengan Berbilang Teg Dengan Cekap Menggunakan SQL Joins?

Bagaimana untuk Mencari Pengguna dengan Berbilang Teg Dengan Cekap Menggunakan SQL Joins?

Patricia Arquette
Lepaskan: 2024-12-23 17:30:14
asal
966 orang telah melayarinya

How to Efficiently Find Users with Multiple Tags Using SQL Joins?

SQL untuk Memohon Syarat pada Berbilang Baris dalam Gabungan

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:

  • WUJUD Klausa: Mengesahkan kewujudan baris dalam jadual B yang sepadan dengan syarat.
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')
Salin selepas log masuk
  • Sub-pertanyaan: Padanan berdasarkan baris dalam jadual B.
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') 
Salin selepas log masuk
  • SERTAI: Mengagregatkan baris dengan bergabung dengan jadual B beberapa kali.
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'
Salin selepas log masuk

2. Mengagregatkan Baris:

  • KIRAAN: Sesuai jika jadual B melindungi daripada teg pendua.
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
Salin selepas log masuk
  • Pemprosesan Rentetan (bukan SQL standard): Menggabungkan tag ke dalam rentetan dan menyemak kehadiran teg khusus.
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 
Salin selepas log masuk

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!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan