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

SQL添加WHERE id_user后排名始终为1的问题求助

解决特定用户正确排名的问题

你的核心问题在于先过滤用户再计算排名,此时数据集仅包含目标用户,排名自然为1。正确的逻辑是先计算所有用户的完整排名,再从中筛选目标用户的记录。以下是两种可行方案:

方案1:基于原有变量写法改造

将完整的排名结果作为子查询,在外层添加用户过滤条件:

SELECT rank, total, id_user
FROM (
    SELECT 
        @rownum := @rownum + 1 AS rank, 
        total, 
        id_user 
    FROM 
        (SELECT 
             SUM(PPC + 1eC + 2eC + 3eC + srC) AS total, 
             id_user 
         FROM 
             race 
         GROUP BY 
             id_user 
         ORDER BY 
             total DESC) T, 
        (SELECT @rownum := 0) a
) user_ranks
WHERE id_user = 目标用户ID; -- 替换为实际用户ID

方案2:使用窗口函数(推荐,MySQL 8.0+支持)

窗口函数可以更简洁地实现排名逻辑,还能灵活处理同分场景:

场景A:每个用户排名唯一(即使积分相同)

用ROW_NUMBER():

SELECT 
    ROW_NUMBER() OVER (ORDER BY total DESC) AS rank,
    total,
    id_user
FROM (
    SELECT 
        SUM(PPC + 1eC + 2eC + 3eC + srC) AS total,
        id_user
    FROM race
    GROUP BY id_user
) user_totals
WHERE id_user = 目标用户ID;

场景B:同分用户共享排名,后续排名跳过空位

用RANK():

SELECT 
    RANK() OVER (ORDER BY total DESC) AS rank,
    total,
    id_user
FROM (
    SELECT 
        SUM(PPC + 1eC + 2eC + 3eC + srC) AS total,
        id_user
    FROM race
    GROUP BY id_user
) user_totals
WHERE id_user = 目标用户ID;

场景C:同分用户共享排名,后续排名不跳过空位

用DENSE_RANK():

SELECT 
    DENSE_RANK() OVER (ORDER BY total DESC) AS rank,
    total,
    id_user
FROM (
    SELECT 
        SUM(PPC + 1eC + 2eC + 3eC + srC) AS total,
        id_user
    FROM race
    GROUP BY id_user
) user_totals
WHERE id_user = 目标用户ID;

关键逻辑说明

无论哪种方案,核心都是先对所有用户的积分汇总排序并生成排名,再筛选目标用户,这样得到的排名才是该用户在整体用户群体中的真实位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:25:18