Domanda

Come posso ottimizzare questa query? Sembra che ci dovrebbe essere un modo molto più semplice per farlo. L'obiettivo è che sarà ancora possibile trasformarlo prontamente in una dichiarazione di eliminazione.

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
                 )
È stato utile?

Soluzione

Un rapido sguardo a questa query mi dà questo:

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

Sembra che tu stia cercando di trovare tutti i team che si trovano in un evento ma non sono presenti nella tabella di iscrizione. È accurato?

Inoltre, desidero notare che sarà più veloce fare join rispetto a un sacco di subquery, specialmente se le subquery dipendono da ogni riga (nel tuo caso, lo fanno).

Saluti,
Eric

Altri suggerimenti

Commentando la query di Eric in questo thread, consiglierei (dal mio background di mssqlserver) di usare invece un controllo esistenziale. In questo modo (1) rendi più chiaro il tuo intento e (2) dà all'ottimizzatore l'opportunità di interrompere l'esame per un team_id corrispondente dopo che il primo è stato trovato (poiché > = 1 riga corrispondente causa un controllo esistenziale falso). Per es.

selezionare     t. * a partire dal     squadra t     pianificazione join interno s su t.schedule_id = s.schedule_id     evento join interno e su s.event_id = e.event_id dove     e.event_id = 183     e non esiste (selezionare * dall'iscrizione dove team_id = t.team_id)

Ma forse ci sono preoccupazioni perf specifiche per mysql.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top