Ecco un metodo tipico per eseguire questa query senza utilizzare il metodo subquery 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. È preferibile 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);
Questo è un subquery correlato, 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 meglio di "column NOT IN (...)
"
Anche in questo caso, è necessario testare ciascuna soluzione e confrontare i risultati per essere sicuri. È una perdita di tempo scegliere una soluzione senza misurare le prestazioni.
fonte
2009-02-13 00:05:51
Se il ridimensionamento non è corretto, l'indicizzazione non è efficace. Quali sono i tuoi indici? – dkretz
> Funziona bene ma non sembra scalare molto bene. C'è un approccio migliore a questo? Hai provato EXPLAIN su questa query? – VolkerK