最优解决方案:
步骤:
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经不住并发,并发问题可以参考上一篇文章...