Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL WHERE IN Abfrage - ORDER BY Match

Wenn ich das richtig verstehe, möchten Sie die Ergebnisse nach der Anzahl der Übereinstimmungen in absteigender Reihenfolge sortieren. Versuchen Sie dazu Folgendes:

SELECT movie
  FROM genre_rel 
 WHERE genre IN (1, 8, 3) 
 GROUP BY movie
 order by count(movie) desc

Und wenn Sie Filme wollen, die alle Kriterien erfüllen, können Sie Folgendes verwenden:

SELECT movie
  FROM genre_rel 
 WHERE genre IN (1, 8, 3) 
 GROUP BY movie
HAVING count(movie) = 3

UPDATE:

Dies ist das Beste, was ich in MySql tun kann. Sie können IN nicht verwenden, da Sie keine Informationen über die Reihenfolge von Filtern extrahieren können. Wenn Sie eine abgeleitete Tabelle zum Filtern hinzufügen, können Sie diese Informationen anhängen und verwenden, um Ergebnisse nach Positionsübereinstimmungen anzuzeigen. Beachten Sie, dass Sie in der genre_rel-Tabelle keine Bestellinformationen angeben, sodass Sie die Bedeutung der Genres pro Film nicht wirklich kennen. Diese Abfrage gibt Ihnen passende Filme nach absteigender Wichtigkeit der Genres in Kriterien:

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

Beachten Sie, dass alle Filme außer 5 zu allen 3 Genres gehören. Wenn Sie genre_rel eine Spalte hinzufügen, die die Wichtigkeitsreihenfolge darstellt, könnten Sie eine Mathematik entwickeln (Gewicht - Wichtigkeit oder etwas Ähnliches).