Voici une manière typique de faire cette requête sans utiliser la méthode de sous-requête que vous avez montrée. Cela peut satisfaire la demande de @ Godeke de voir une solution basée sur les jointures. Cependant, dans la plupart des marques de base de données, cette solution peut être moins performante que la solution de la sous-requête. Cependant, dans la plupart des marques de base de données, cette solution peut être moins performante que la solution de sous-requête. Il est préférable d'utiliser EXPLAIN pour analyser les deux requêtes, afin de déterminer laquelle sera la mieux adaptée à votre schéma et à vos données.
Voici une autre variante de la solution de sous-requête:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Ceci est une sous-requête corrélée, qui doit être évalué pour chaque ligne de la requête externe. Habituellement, cela coûte cher, et votre requête d'exemple originale est meilleure. D'autre part, dans MySQL "NOT EXISTS
" est souvent mieux que "column NOT IN (...)
"
Encore une fois, vous devez tester chaque solution et comparer les résultats pour être sûr. C'est une perte de temps de choisir une solution sans mesurer les performances.
Si la mise à l'échelle échoue, l'indexation n'est pas effective. Quels sont vos index? – dkretz
> Cela fonctionne bien, mais ne semble pas très bien évoluer. Y a-t-il une meilleure approche à cela? Avez-vous essayé EXPLAIN sur cette requête? – VolkerK