求助:编写SQL查询返回符合规则的Top10 movie_id
解决思路与SQL实现
没问题,我来帮你搞定这个SQL查询需求~首先得明确你的核心排序逻辑:先优先返回点赞数最高的电影,同点赞数按movie_id升序;如果点赞的电影不够10部,就补那些无点赞的(不管是踩了还是没评分的),补位的部分按movie_id升序;如果总电影数不足10,就返回全部。
最终SQL代码(支持CTE的数据库)
WITH movie_stats AS ( SELECT movie_id, COUNT(CASE WHEN Rank = 'LIKE' THEN 1 END) AS like_count FROM tbl GROUP BY movie_id ) SELECT movie_id FROM movie_stats ORDER BY CASE WHEN like_count > 0 THEN 0 ELSE 1 END, -- 优先排有点赞的电影 like_count DESC, -- 点赞数多的在前 movie_id ASC -- 点赞数相同/无点赞时按ID升序 LIMIT 10;
兼容老版本数据库的写法(子查询替代CTE)
如果你的数据库不支持CTE(比如MySQL 5.x及以前版本),可以用子查询实现同样逻辑:
SELECT movie_id FROM ( SELECT movie_id, COUNT(CASE WHEN Rank = 'LIKE' THEN 1 END) AS like_count FROM tbl GROUP BY movie_id ) AS movie_stats ORDER BY CASE WHEN like_count > 0 THEN 0 ELSE 1 END, like_count DESC, movie_id ASC LIMIT 10;
代码细节解释
- 统计点赞数:用
COUNT(CASE WHEN Rank = 'LIKE' THEN 1 END)精准统计每部电影的点赞次数,无点赞的电影like_count会自动为0。 - 排序优先级:
- 第一个排序条件通过
CASE把「有点赞」的电影标记为0,「无点赞」的标记为1,确保有点赞的电影始终排在前面,满足规则1的优先级要求。 - 第二个条件按
like_count降序排列,保证点赞数多的电影先返回。 - 第三个条件按
movie_id升序,既处理了点赞数相同的排序,也满足补位电影的排序规则。
- 第一个排序条件通过
- LIMIT 10:限制最多返回10条记录,若总电影数不足10,自动返回所有符合排序的结果,完全匹配规则3。
内容的提问来源于stack exchange,提问作者genericname
相关产品推荐
相关产品推荐

