You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:编写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。
  • 排序优先级:
    1. 第一个排序条件通过CASE把「有点赞」的电影标记为0,「无点赞」的标记为1,确保有点赞的电影始终排在前面,满足规则1的优先级要求。
    2. 第二个条件按like_count降序排列,保证点赞数多的电影先返回。
    3. 第三个条件按movie_id升序,既处理了点赞数相同的排序,也满足补位电影的排序规则。
  • LIMIT 10:限制最多返回10条记录,若总电影数不足10,自动返回所有符合排序的结果,完全匹配规则3。

内容的提问来源于stack exchange,提问作者genericname

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:58:40