8

我试图改写我的问题,因为我的最后一个问题对每个人都不是很清楚。

这是我的测试表

+----------+---------+-------+
|  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  |
+----------+---------+-------+

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

如果不可能,那么我只想要完全匹配“1、8、3”的所有内容,在这种情况下,我只会得到电影编号。3 和 8。

4

5 回答 5

12

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

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

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

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

更新:

这是我在 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

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

于 2012-03-21T08:41:19.453 回答
3

您可以通过以下方式执行此操作:

SELECT distinct movie FROM genre_rel WHERE genre IN (1, 8, 3);
于 2012-03-21T08:36:18.657 回答
0

您在流派列上给出了标准。如果您的电影 5 还包含流派 8 和 3。由于这个原因,你也得到了电影 5。

于 2012-03-21T08:36:57.930 回答
0

怎么样:

SELECT movie, SUM(gentre) AS count 
  FROM genre_rel 
  WHERE genre IN (1, 8, 3) 
  GROUP BY movie 
  ORDER BY count DESC
于 2012-03-21T08:41:01.967 回答
0

试试这个查询 -

SELECT movie FROM genre_rel
  GROUP BY movie
ORDER BY
  IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, genre + 1000)

其中 1000 是不匹配电影的订单偏移量,如果需要,请增加此值。

另外,你可以试试这个 ORDER BY -

ORDER BY IF(COUNT(IF(genre IN (1, 8, 3), 1, NULL)) = 3, genre, MAX(genre))
于 2012-03-21T08:45:48.803 回答