Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Menapis Pelajar Yang Kepunyaan Pelbagai Kelab dengan Cekap dalam Hubungan Telah Banyak Melalui?

Bagaimana untuk Menapis Pelajar Yang Kepunyaan Pelbagai Kelab dengan Cekap dalam Hubungan Telah Banyak Melalui?

Linda Hamilton
Lepaskan: 2025-01-23 21:31:10
asal
950 orang telah melayarinya

How to Efficiently Filter Students Belonging to Multiple Clubs in a Has-Many-Through Relationship?

Menapis Keputusan SQL dalam Hubungan Has-Many-Through: Panduan Praktikal

Menyoal data dengan cekap merentas jadual dengan perhubungan has-many-through adalah penting untuk prestasi pangkalan data. Mari kita ilustrasikan dengan senario biasa yang melibatkan tiga jadual:

  • student (id, nama)
  • club (id, nama)
  • student_club (id_pelajar, id_kelab)

Cabaran: Kenal pasti pelajar yang menjadi ahli kedua-dua kelab bola sepak (club_id 30) dan besbol (club_id 50).

Mengapa JOIN Mudah Gagal:

Pendekatan naif menggunakan cantuman adalah tidak berkesan:

<code class="language-sql">SELECT student.*
FROM student
INNER JOIN student_club sc ON student.id = sc.student_id
LEFT JOIN club c ON c.id = sc.club_id
WHERE c.id = 30 AND c.id = 50;</code>
Salin selepas log masuk

Ini gagal kerana satu rekod club tidak boleh mempunyai id = 30 dan id = 50 secara serentak.

Penyelesaian Berkesan:

1. Bersarang IN Pertanyaan:

Pendekatan ini menggunakan dua subkueri untuk mencari pelajar dalam setiap kelab dan kemudian memotong keputusan:

<code class="language-sql">SELECT student.*
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 30
) AND student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 50
);</code>
Salin selepas log masuk

Kaedah ini secara amnya cekap, walaupun dengan set data yang besar.

2. Menggunakan INTERSECT:

Pengendali INTERSECT menyediakan penyelesaian yang lebih ringkas:

<code class="language-sql">SELECT student.*
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 30
)
INTERSECT
SELECT student.id
FROM student
WHERE student.id IN (
    SELECT student_id
    FROM student_club
    WHERE club_id = 50
);</code>
Salin selepas log masuk

INTERSECT hanya mengembalikan ID pelajar biasa daripada kedua-dua subkueri, dengan berkesan mengenal pasti pelajar dalam kedua-dua kelab. Pilihan antara ini dan pendekatan IN bersarang selalunya bergantung pada keutamaan sistem pangkalan data dan tingkah laku pengoptimum pertanyaan. Kedua-duanya secara amnya cekap untuk tugasan ini.

Atas ialah kandungan terperinci Bagaimana untuk Menapis Pelajar Yang Kepunyaan Pelbagai Kelab dengan Cekap dalam Hubungan Telah Banyak Melalui?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan