题解 | #获得积分最多的人三,窗口函数排名取多个前几名#
获得积分最多的人(三)
https://www.nowcoder.com/practice/d2b7e2a305a7499fb310dc82a43820e8
SELECT user_id id, name, b grade_num FROM ( SELECT user_id, name, b, rank() over(order by b desc) pai FROM ( SELECT user_id, sum(o) b FROM ( SELECT user_id, if(type="reduce",0-grade_num,grade_num) o FROM grade_info ) a GROUP BY user_id ) c LEFT JOIN user d ON c.user_id=d.id ) e WHERE pai=1
多层嵌套子查询,多少有些丑陋
1.先把积分表里减少的积分转换为负数生成表a
2.按照user_id分组计算积分和,生成表c
3.把表c和user(表d)连接取得name,并对积分和进行排名,生成表e
4.从用where筛选出排名为1的数据

