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添加一个代表重要性顺序的列,你可以设计一些数学(权重 - 重要性或类似的东西).
| 归档时间: |
|
| 查看次数: |
60473 次 |
| 最近记录: |