Comment puis-je optimiser cette requête?
Question
Comment puis-je optimiser cette requête? Il semble qu'il devrait y avoir un moyen beaucoup plus facile de faire cela. L’objectif est qu’elle puisse toujours être facilement transformée en déclaration delete.
SELECT * FROM team
WHERE team_id IN (
SELECT team_id
FROM (
SELECT team.team_id, (
SELECT COUNT(*)
FROM signup
WHERE signup.team_id = team.team_id
) AS members
FROM team, schedule, event
WHERE team.schedule_id = schedule.schedule_id
AND schedule.event_id = event.event_id
AND event.event_id =183) AS t
WHERE members = 0
)
La solution
Un rapide coup d'œil sur cette requête me donne ceci:
select
t.*
from
team t
inner join schedule s on t.schedule_id = s.schedule_id
inner join event e on s.event_id = e.event_id
left outer join signup sp on t.team_id = sp.team_id
where
e.event_id = 183
and sp.team_id is null
Il semble que vous essayiez de trouver toutes les équipes participant à un événement mais ne figurant pas dans la table des inscriptions. Est-ce exact?
De plus, je voulais noter qu'il sera plus rapide de faire des jointures que plusieurs sous-requêtes, en particulier si elles dépendent de chaque ligne (dans votre cas, c'est le cas).
À la vôtre,
Eric
Autres conseils
Commentant la requête d’Eric dans ce fil de discussion, je recommanderais (à partir de mon arrière-plan mssqlserver) d’utiliser un contrôle existentiel à la place. Cela (1) clarifie votre intention et (2) donne à l'optimiseur la possibilité de cesser de rechercher un ID_équipe correspondant une fois que le premier a été trouvé (car la valeur de > = 1 correspond au contrôle existentiel). Ex.
sélectionnez t. * de équipe t calendrier de jointure interne s sur t.schedule_id = s.schedule_id événement de jointure interne e sur s.event_id = e.event_id où e.event_id = 183 et n'existe pas (sélectionnez * depuis l'inscription où team_id = t.team_id)
Mais peut-être y at-il des problèmes de performances spécifiques avec MySQL.