项目场景:
用户考试练习答题记录,对答题所获得的分数进行排行统计。不管是uuid还是连续自增的主键id,再多个用户分数相同的情况下,进行分组排序、分页查询时,会出现bug。
例如:在uuid作为主键(不管是自增的id还是uuid),需要对用户所答题产生的答题记录进行一个分组、排序、分页查询统计并排行的功能。
问题描述:
排行统计时,当分页的时候,仍会显示上一页最后一条记录。
例如:查询的sql语句
# 查询第一页的时候
select user_id, sum(rank_score) as 'rank_score' from user_activity
GROUP BY user_id ORDER BY rank_score desc limit 0, 10
select user_id, sum(rank_score) as 'rank_score' from user_activity
GROUP BY user_id ORDER BY rank_score desc limit 10, 10
这样一来,在分页时,就会产生两条相同用户的记录。
原因分析:
主要造成的原因是由于指对分数进行了一个排序的规则,且刚好用户前一页最后一条数据和下一页第一条数据用户得分分数是相同的情况下,没有对用户id进行一个排序,且用户的id是uuid生成的,这样一来翻页的时候,在分数相同的情况下,就会产生bug。
解决方案:
首页在进行分组排序时,首先根据统计的分数进行排序,然后再对用户id进行一个排序,这样才不会产生上述问题带来的bug.
select user_id, sum(rank_score) as 'rank_score' from user_activity
GROUP BY user_id ORDER BY rank_score desc, user_id asc limit 0, 10
select user_id, sum(rank_score) as 'rank_score' from user_activity
GROUP BY user_id ORDER BY rank_score desc, user_id asc limit 10, 10