• 参考答案
select 
u.id,
u.name,
t.grade_sum grade_sum
from user u,(
    select user_id,
    sum(if(type='add',grade_num,-grade_num)) grade_sum,
    dense_rank() over(order by sum(if(type='add',grade_num,-grade_num)) desc) rk
    from grade_info gi
    group by user_id
    ) t
where u.id=t.user_id and rk=1
order by u.id
  • 本题解析
    题中让我们查的数据中,id和name直接从user表中查出来就可以了;
    关键是查grade_sum,分数有加有减,所以我们用if判断一下:
sum(if(type='add',grade_num,-grade_num))

积分统计出来了之后,进行排序,利用dense_rank()正好可以帮我们得到rank=1的数据

dense_rank() over(order by sum(if(type='add',grade_num,-grade_num)) desc)