Maison >base de données >tutoriel mysql >Comment filtrer efficacement les étudiants appartenant à plusieurs clubs dans une relation à plusieurs ?
Filtrer les résultats SQL dans les relations à plusieurs passages : un guide pratique
Interroger efficacement les données sur les tables avec une relation multiple est crucial pour les performances de la base de données. Illustrons avec un scénario courant impliquant trois tables :
student
(identifiant, nom)club
(identifiant, nom)student_club
(student_id, club_id)Défi : Identifiez les étudiants qui sont membres des les deux clubs de football (club_id 30) et de baseball (club_id 50).
Pourquoi un simple JOIN échoue :
Une approche naïve utilisant des jointures est inefficace :
<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>
Cela échoue car un seul enregistrement club
ne peut pas avoir simultanément id = 30
et id = 50
.
Solutions efficaces :
1. IN
Requêtes imbriquées :
Cette approche utilise deux sous-requêtes pour rechercher des étudiants dans chaque club puis recoupe les résultats :
<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>
Cette méthode est généralement efficace, même avec de grands ensembles de données.
2. Utilisation de INTERSECT
:
L'opérateur INTERSECT
propose une solution plus concise :
<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>
INTERSECT
renvoie uniquement les identifiants d'étudiant communs des deux sous-requêtes, identifiant efficacement les étudiants des deux clubs. Le choix entre cette approche et l'approche IN
imbriquée dépend souvent des préférences du système de base de données et du comportement de l'optimiseur de requêtes. Les deux sont généralement efficaces pour cette tâche.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!