题解:
查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序。
第一个难点在于最高的用户可能有多个,则这里不能用LIMIT 1来查找最值,想到用WHERE或者HAVING来筛选出grade_sum等于最大值的所有用户。一钟是在WHERE后用子查询查找出最大值令grade_sum等于它;另一种是利用窗口函数给grade_sum一个排名,直接利用WHERE rk=1,这里我们用窗口函数。
第二个难点在于根据type分类加减积分,用sum()和if()嵌套使用解决。
第三个难点在于语句的结构。这里使用子查询嵌套,最里层子查询先查询出user_id和grade_sum,第二层子查询增加一个窗口函数排名列。之后左联接user表获得name列,最后用WHERE rk=1获取积分最高的用户。
SELECT id,name,g.grade_sum
FROM(SELECT user_id,grade_sum,rank()over(order by grade_sum DESC) rk
FROM(SELECT
user_id,sum(if(type='add',grade_num,-1*grade_num)) grade_sum
FROM grade_info
GROUP BY user_id) a
) g
LEFT JOIN user ON g.user_id=id
WHERE rk=1
ORDER BY id;