接了一个需求,是一个排行榜的
这个排行榜的筛选条件:
时间筛选,姓名,手机号,会员编码。
因为时间筛选,所以只能通过流水表去查
流水表存有发生时间和会员的各种信息,但姓名、手机号随时可变,所以需要编码来查询。
同积分同排名,比如积分 8 6 6 5 4 的排名:1 2 2 3 4。
经测试 数据库百万级数据传入代码会导致服务崩溃,故需分页后传回。
前端需要排名总条数来显示分页。
目前的解决方案是
在流水表中将会员分组sum后通过sql排序 使用dense_rank进行排名计算,在当前sql外层进行in查询
select
subquery.`rank`,
subquery.会员编码 as 会员编码,
subquery.积分 as 积分
from(
select
dense_rank() over (order by ifnull(SUM(积分变化值),0) desc) as `rank`,
会员id AS 会员id,
ifnull(SUM(积分变化值),0) as 积分
from
积分流水表 mg
where
删除标识 = 0
and 增减标识 = 1
<if test="dto.startTime!=null">
and create_time >= #{dto.startTime}
</if>
<if test="dto.endTime!=null">
and create_time <= #{dto.endTime}
</if>
GROUP BY
会员id
order by null
)as subquery
<if test="dto.会员id拼接的字符串 != null and dto.会员id拼接的字符串.size() > 0">
where
subquery.member_id in ${dto.会员id拼接的字符串}
</if>
limit 0,10
大老们有什么优化方案~