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
相关产品推荐
相关产品推荐

