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
                 )
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top