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
                 )
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top