sql >> Database >  >> RDS >> Mysql

MySQL WHERE IN Query - ORDER BY Match

Als ik het goed begrijp, wil je de resultaten sorteren op aantal overeenkomsten in aflopende volgorde. Om dit te doen, kunt u het volgende proberen:

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

En als u films wilt die aan alle criteria voldoen, kunt u het volgende gebruiken:

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

BIJWERKEN:

Dit is het beste wat ik kan doen in MySql. U kunt IN niet gebruiken omdat u geen informatie over de volgorde van filters kunt extraheren. Als u een afgeleide tabel toevoegt om te filteren, kunt u deze informatie toevoegen en gebruiken om resultaten weer te geven op basis van positionele overeenkomsten. Merk op dat je geen bestelinformatie opgeeft in de genre_rel-tabel, dus je weet niet echt het belang van genres per film. Deze zoekopdracht geeft u overeenkomende films in aflopende volgorde van belangrijkheid van genres in criteria:

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

Merk op dat alle films behalve 5 tot alle 3 de genres behoren. Als je een kolom toevoegt aan genre_rel die de volgorde van belangrijkheid voorstelt, zou je wat wiskunde kunnen bedenken (gewicht - belangrijkheid of iets dergelijks).



  1. het negeren van mysql fulltext stopwoorden in query

  2. Barker's notatie

  3. Door de mysql-database bladeren

  4. Agent Decomission in EM13c