sql >> Base de Datos >  >> RDS >> Mysql

MySQL:encontrar filas que no forman parte de una relación

Aquí hay una forma típica de hacer esta consulta sin usar el método de subconsulta que mostró. Esto puede satisfacer la solicitud de @Godeke de ver una solución basada en combinaciones.

SELECT * 
FROM movies m
 LEFT OUTER JOIN seen s
 ON (m.id = s.movie_id AND s.user_id = 123)
WHERE s.movie_id IS NULL;

Sin embargo, en la mayoría de las marcas de bases de datos, esta solución puede funcionar peor que la solución de subconsulta. Es mejor usar EXPLAIN para analizar ambas consultas, para ver cuál funcionará mejor según su esquema y datos.

Aquí hay otra variación de la solución de subconsulta:

SELECT * 
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s 
                  WHERE s.movie_id = m.id 
                    AND s.user_id=123);

Esta es una subconsulta correlacionada, que debe evaluarse para cada fila de la consulta externa. Por lo general, esto es costoso y su consulta de ejemplo original es mejor. Por otro lado, en MySQL "NOT EXISTS " suele ser mejor que "column NOT IN (...) "

Nuevamente, debe probar cada solución y comparar los resultados para estar seguro. Es una pérdida de tiempo elegir cualquier solución sin medir el rendimiento.