Si je comprends bien, vous voulez trier les résultats par nombre de correspondances dans l'ordre décroissant. Pour ce faire, vous pouvez essayer :
SELECT movie
FROM genre_rel
WHERE genre IN (1, 8, 3)
GROUP BY movie
order by count(movie) desc
Et si vous voulez des films qui correspondent à tous les critères, vous pouvez utiliser :
SELECT movie
FROM genre_rel
WHERE genre IN (1, 8, 3)
GROUP BY movie
HAVING count(movie) = 3
MISE À JOUR :
C'est le mieux que je puisse faire dans MySql. Vous ne pouvez pas utiliser IN car vous ne pouvez pas extraire d'informations sur l'ordre des filtres. Si vous ajoutez une table dérivée comme moyen de filtrage, vous pouvez ajouter ces informations et les utiliser pour afficher les résultats par correspondances de position. Notez que vous ne fournissez aucune information de commande dans la table genre_rel, vous ne connaissez donc pas vraiment l'importance des genres par film. Cette requête vous donnera des films correspondants par ordre décroissant d'importance des genres dans les critères :
SELECT movie
FROM genre_rel
INNER join
(
select 1 genre, 1000 weight
union all
select 8, 100
union all
select 3, 10
) weights
on genre_rel.genre = weights.genre
GROUP BY movie
order by sum(weight) desc
Notez que tous les films sauf 5 appartiennent aux 3 genres. Si vous ajoutez une colonne à genre_rel représentant l'ordre d'importance, vous pourriez concevoir des mathématiques (poids - importance ou quelque chose de similaire).