Wie kann ich optimieren diese Abfrage?
Frage
Wie kann ich optimieren diese Abfrage? Es scheint, sollte es ein viel einfacherer Weg, dies zu tun. Das Ziel ist es, dass es noch in der Lage sein wird, leicht in eine Delete-Anweisung gedreht werden.
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
)
Lösung
Ein kurzer Blick auf diese Abfrage gibt mir diese:
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
Es sah aus wie Sie versuchen, alle Teams zu finden, die in einem Fall sind, aber nicht in der Registrierung Tabelle. Ist das korrekt?
Auch wollte ich anmerken, dass es schneller sein, um eine Reihe von Unterabfragen zu tun schließt sich dann, vor allem, wenn die Unterabfragen in jeder Zeile ab (in Ihrem Fall, sie tun).
Cheers,
Eric
Andere Tipps
auf Erics Abfrage in diesem Thread kommentiert, würde ich (aus meinem mssqlserver Hintergrund) empfehle stattdessen eine existenzielle Prüfung zu verwenden. so (1) zu tun macht Ihre Absicht klarer und (2) gibt das Optimierungsprogramm die Möglichkeit, nach einem passenden team_id zu stoppen Prüfung nach den ersten einem gefunden wird (da> = 1 passende Zeile der existentielle Prüfung verursacht, falsch zu sein). Z.
wählen t. * von Team t INNER JOIN Zeitplan s auf t.schedule_id = s.schedule_id INNER JOIN Ereignis e auf s.event_id = e.event_id wo e.event_id = 183 und nicht vorhanden ist (select * from Anmeldungen wo team_id = t.team_id)
Aber vielleicht gibt es mysql spezifische perf betrifft.