描述
牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下:
id | name |
1 | tm |
2 | wwy |
3 | zk |
4 | |
5 | lm |
还有一个积分表(grade_info),简况如下:
user_id | grade_num | type |
1 | 3 | add |
2 | 3 | add |
1 | 1 | reduce |
3 | 3 | add |
4 | 3 | add |
5 | 3 | add |
3 | 1 | reduce |
第1行表示,user_id为1的用户积分增加了3分。
第2行表示,user_id为2的用户积分增加了3分。
第3行表示,user_id为1的用户积分减少了1分。
.......
最后1行表示,user_id为3的用户积分减少了1分。
请你写一个SQL查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序,以上例子查询结果如下:
id | name | grade_num |
2 | wwy | 3 |
4 | 3 | |
5 | lm | 3 |
解释:
user_id为1和3的先加了3分,但是后面又减了1分,他们2个是2分,
其他3个都是3分,所以输出其他三个的数据
参考答案
with t1 as (
select sum(if(type='add',grade_num,-grade_num)) grade
from grade_info
group by user_id
order by grade desc
limit 1
)
select
user_id id,
min(u.name) name,
sum(if(type='add',grade_num,-grade_num)) 'grade_num'
from grade_info gi join user u on gi.user_id=u.id
group by id
having grade_num=(
select * from t1
)
order by id