下面代码是获得积分最多的人(一)(二)(三)的通解,第一题只是将第一行后的a.id去掉就可以了!~
思路如下:
- 1.求每个用户的总积分
- 2.题意中相同积分需要输出,按总积分采用dense_rank() over()排序,取排名为1即可

SELECT a.id,
       a.name,
       b.grade_sum
FROM user a
JOIN
  (SELECT user_id,
          grade_sum,
          dense_rank() over(
                            ORDER BY grade_sum DESC) AS r
   FROM
     (SELECT user_id,
             sum(if(TYPE='add',1,-1)*grade_num) AS grade_sum
      FROM grade_info
      GROUP BY user_id) t1) b ON a.id = b.user_id
WHERE r=1
ORDER BY id