Her er en typisk måde at udføre denne forespørgsel på uden at bruge den underforespørgselsmetode, du viste. Dette kan opfylde @Godekes anmodning om at se en join-baseret løsning.
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;
I de fleste databasemærker kan denne løsning dog fungere dårligere end underforespørgselsløsningen. Det er bedst at bruge EXPLAIN til at analysere begge forespørgsler for at se, hvilken der vil klare sig bedre givet dit skema og dine data.
Her er en anden variant af underforespørgselsløsningen:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Dette er en korreleret underforespørgsel, som skal evalueres for hver række i den ydre forespørgsel. Normalt er dette dyrt, og din originale eksempelforespørgsel er bedre. På den anden side, i MySQL "NOT EXISTS
" er ofte bedre end "column NOT IN (...)
"
Igen skal du teste hver løsning og sammenligne resultaterne for at være sikker. Det er spild af tid at vælge enhver løsning uden at måle ydeevnen.