MySQL WHERE IN查询 - ORDER BY匹配

ric*_*hie 6 mysql sql sql-order-by where-in

更新的问题

你好,

我试着改写我的问题,因为我的最后一个问题并不是每个人都清楚的.

这是我的测试表

+----------+---------+-------+
|  rel_id  |  genre  | movie |
+----------+---------+-------+
|    1     |    1    |   3   |
|    2     |    8    |   3   |
|    3     |    3    |   3   |
|    4     |    2    |   5   |
|    5     |    8    |   5   |
|    6     |    3    |   5   |
|    7     |    1    |   8   |
|    8     |    8    |   8   |
|    9     |    3    |   8   |
|   10     |    5    |   9   |
|   11     |    7    |   9   |
|   12     |    9    |   9   |
|   13     |    4    |   9   |
|   14     |    12   |   9   |
|   15     |    1    |   10  |
|   16     |    8    |   10  |
|   17     |    3    |   10  |
|   18     |    5    |   10  |
|   19     |    1    |   11  |
|   20     |    2    |   11  |
|   21     |    8    |   11  |
|   22     |    5    |   11  |
|   23     |    3    |   11  |
+----------+---------+-------+
Run Code Online (Sandbox Code Playgroud)

如果我查找类型为1,8,3的电影,结果应按以下顺序排列:电影号码.3,8,10,5,11(9出).

如果它不可能,那么我只想要所有的完全匹配"1,8,3",在这种情况下我只会得到电影号.3和8.

谢谢!

Nik*_*vić 10

如果我理解正确,您希望按降序排列匹配数对结果进行排序.为此,您可以尝试:

SELECT movie
  FROM genre_rel 
 WHERE genre IN (1, 8, 3) 
 GROUP BY movie
 order by count(movie) desc
Run Code Online (Sandbox Code Playgroud)

如果您想要符合所有条件的电影,您可以使用:

SELECT movie
  FROM genre_rel 
 WHERE genre IN (1, 8, 3) 
 GROUP BY movie
HAVING count(movie) = 3
Run Code Online (Sandbox Code Playgroud)

更新:

这是我在MySql中可以做的最好的事情.您无法使用IN,因为您无法提取有关过滤器顺序的信息.如果添加派生表作为过滤方式,则可以附加此信息并使用它来按位置匹配显示结果.请注意,您不在genre_rel表中提供任何订购信息,因此您并不真正了解每部电影类型的重要性.此查询将按标准中类型的重要性降序为您提供匹配的电影:

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
Run Code Online (Sandbox Code Playgroud)

请注意,除5之外的所有电影都属于所有3种类型.如果你向genre_rel添加一个代表重要性顺序的列,你可以设计一些数学(权重 - 重要性或类似的东西).