mysql对数据统计后实现排名

1、需求是统计用户答题的榜单,用户答题的数据表存了用户id,答题题目和答题时间,现在需要根据答题数和答题时间进行统计和得到排名。
2、之前尝试使用了以下方法进行统计

SET @counter=0;
select @counter:=@counter+1 AS rank,uid,count(*) answercount,sum(finishtime) timestampsum  from huiyi_answer_record group by uid order by answercount DESC,timestampsum ASC limit 0,10;    

然后发现排名只依赖第一个Order条件,当第二个条件导致顺序改变的时候排名依旧没有改变。
3、问题1:请问应该怎么正确对统计后的数据进行排名(有分页)?
4、问题2:请问在每次分页下,怎么能直接得到某个用户的排名和数据?

5、补充测试结果。如图,mysql返回的结果排序是正确的,但rank不对。
图片描述

阅读 6.9k
5 个回答

用子查询

SET @counter=0;

select t2.* from (

    select t1.*,@counter:=@counter+1 AS rank from (
        select uid,count(*) answercount,sum(finishtime) timestampsum  from huiyi_answer_record group by uid order by answercount DESC,timestampsum asc
    ) as t1

) as t2 limit 2,2;

# 或者

SET @counter=2; #查询第二页,假如每页2条,起始值就是2

select t1.*,@counter:=@counter+1 AS rank from (
    select uid,count(*) answercount,sum(finishtime) timestampsum  from huiyi_answer_record group by uid order by answercount DESC,timestampsum asc
) as t1 limit 2,2

你是想对答题数目 和 时间 分别赋予不同权重么.
像你这种排序, 它是优先第一位的
就好比

A    B
20   5
19   9999

不管你B有多大, 你的A比别人小它永远在后面

第二排序是当第一个排序的字段相同时才会生效

redis sorted set

问题一: 只有当第一个排序条件(DESC)的值相等时,第二个排序条件(ASC)起作用。
问题二: 先要找个第几页的排名数据,然后在从这个页找到这个人的排名数据(假如每页10条数据):

DELETER $
create PROCEDURE get_user_in_page(uid INT, page INT, page_size INT)
begin
SET @_uid = uid;
SET @_page_size = page_size;
SET @_offset = (@_page - 1) * @_page_size;
SET @counter = 0;

PREPARE stmt FROM "select * from (select @counter:=counter+1 as rank, uid, count(1) ansercount, sum(finishtime) timestampsum from huiyi_answer_record group by uid order by answercount DESC, timestamp ASC limit ?,?) t WHERE t.uid=?;";

EXECUTE stmt USING @_offset, @_page_size, @_uid;
DEALLOCAE PREPARE stmt;
end$

DELIMITER ;

call get_user_in_page(12, 3, 10); # 在第3页的用户uid为12的数据。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题