使用sql查询排行,排名数据

/ 数据库 / 没有评论 / 363浏览

分页查询排行榜

SELECT * FROM ( SELECT userId,( @rowNum := @rowNum + 1 ) AS rankNo 
	FROM
		wf_member,(
		SELECT
		( @rowNum := 0 )) b 
	ORDER BY
		studyTime DESC 
	) x 
	LIMIT 0,10

优化后可以直接在应用中迭代设置排名

        LongAdder adder = new LongAdder();
        //offset为limit的开始
        adder.add(offset + 1);
        vos.stream().forEach(vo -> {
            vo.setRanking(adder.intValue());
            adder.increment();
        });

查询排名第几

SELECT rankNo FROM ( SELECT userId,( @rowNum := @rowNum + 1 ) AS rankNo 
	FROM
		wf_member,(
		SELECT
		( @rowNum := 0 )) b 
	ORDER BY
		studyTime DESC 
	) c 
WHERE
	userId = 123

该Rank函数方式耗时主要是对全表数据进行了排序,并且该字段没有索引,比较慢;

优化

查出比该字段大的数据数量+1即可:

SELECT
	count(*) + 1 
FROM
	wf_member 
WHERE
	studyTime > ( SELECT studyTime FROM wf_member WHERE userId = 123)