SQL285 获得积分最多的人(三)

文章描述了一个关于数据库查询的问题,涉及两个表格:用户表(user)和积分表(grade_info)。用户在平台上进行各种活动会获得或减少积分。任务是编写SQL查询,找出积分最高的用户,包括他们的id、名字和总积分,结果按id升序排序。提供的参考答案使用了CTE(公用表表达式)和子查询来实现这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。

有一个用户表(user),简况如下:

idname
1tm
2wwy
3zk
4qq
5lm

还有一个积分表(grade_info),简况如下:

user_idgrade_numtype
13add
23add
11reduce
33add
43add
53add
31reduce

第1行表示,user_id为1的用户积分增加了3分。

第2行表示,user_id为2的用户积分增加了3分。

第3行表示,user_id为1的用户积分减少了1分。

.......

最后1行表示,user_id为3的用户积分减少了1分。

请你写一个SQL查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序,以上例子查询结果如下:

idnamegrade_num
2wwy3
4qq3
5lm3

解释:

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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值