Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:trovare righe che non prendono parte a una relazione

Ecco un modo tipico per eseguire questa query senza utilizzare il metodo di sottoquery mostrato. Questo potrebbe soddisfare la richiesta di @Godeke di vedere una soluzione basata su join.

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;

Tuttavia, nella maggior parte delle marche di database questa soluzione può avere prestazioni peggiori rispetto alla soluzione di subquery. È meglio utilizzare EXPLAIN per analizzare entrambe le query, per vedere quale funzionerà meglio in base allo schema e ai dati.

Ecco un'altra variazione sulla soluzione subquery:

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

Questa è una sottoquery correlata, che deve essere valutata per ogni riga della query esterna. Di solito questo è costoso e la tua query di esempio originale è migliore. D'altra parte, in MySQL "NOT EXISTS " è spesso migliore di "column NOT IN (...) "

Ancora una volta, devi testare ogni soluzione e confrontare i risultati per essere sicuro. È una perdita di tempo scegliere una soluzione senza misurare le prestazioni.