mysql查询指定用户的排名

最优解决方案:

步骤:

1.查询当前用户的一个分数(排名所需要的条件)

2.在总榜中查询大于等于这个分数的(当前条件)人数(count)值即为排名。

(3.如果存在多个条件决定排名,则需要查询=条件一,并且满足条件二的人数(count)值,将两个相加)

下面展示思路:

 

网上提供的一次就查询出来名次信息的sql我这边也展示,但是这种一次就查询出来的sql语句在高并发的情况下会出现不可预料的问题,sql语句如下:

SELECT * FROM (
    SELECT  a.userId, a.scores, (@i := @i + 1) AS rank 
    FROM (
        -- 查询用户在指定时间内获取的得分(根据用户分组,显示每个用户的得分,再根据分数排序)
        SELECT USER_ID userId,SUM(GET_INTEGRAL) scores,(SELECT @i := 0) AS it 
        FROM T_GAME_JOURNAL 
        WHERE CREATE_TIME BETWEEN '2020-09-24 00:00:00' AND '2020-10-01 20:00:00'
        GROUP BY userId 
        -- 此处可以根据最多两个字段进行排序
        ORDER BY scores DESC
     ) a
) b 
WHERE b.userId = 'ca21015fdd7a484ba44ec0016e26d0b9' 


-- 上面sql所涉及的表结构为:
CREATE TABLE `T_GAME_JOURNAL` (
  `ID` varchar(200) CHARACTER SET utf8mb4 NOT NULL COMMENT '用户积分表ID',
  `USER_ID` varchar(200) DEFAULT NULL COMMENT '用户ID',
  `GET_INTEGRAL` int(20) DEFAULT NULL COMMENT '一局游戏获取积分',
  `CREATE_TIME` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户积分情况表'

上面这个sql语句如果只有一层嵌套的话,会出现rank值恒定为1的问题,然后需要两层嵌套以解决这个问题。这哥sql经不住并发,并发问题可以参考上一篇文章...

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月存5k的欢乐外包仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值