¿Cómo puedo optimizar esta consulta?
Pregunta
¿Cómo puedo optimizar esta consulta? Parece que debería haber una manera mucho más fácil de hacer esto. El objetivo es que aún pueda convertirse fácilmente en una declaración de eliminación.
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
)
Solución
Un vistazo rápido a esta consulta me da esto:
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
Parecía que estabas tratando de encontrar todos los equipos que están en un evento pero que no están en la tabla de registro. ¿Es esto exacto?
Además, quería señalar que será más rápido hacer uniones que un montón de subconsultas, especialmente si las subconsultas dependen de cada fila (en su caso, lo hacen).
Saludos,
Eric
Otros consejos
Al comentar la consulta de Eric en este hilo, recomendaría (desde mi fondo mssqlserver) utilizar una verificación existencial en su lugar. Al hacerlo (1) aclara su intención y (2) le da al optimizador la oportunidad de dejar de examinar un id_de_ equipo después de encontrar el primero (ya que > = 1 fila correspondiente hace que la verificación existencial sea falsa). Por ejemplo,
seleccione t. * desde equipo t programación de unión interna s en t.schedule_id = s.schedule_id evento de unión interna e en s.event_id = e.event_id dónde e.event_id = 183 y no existe (seleccione * del registro donde team_id = t.team_id)
Pero tal vez haya inquietudes de rendimiento específicas de mysql.