列表

详情


SQL284. 获得积分最多的人(二)

描述

牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下:
id name
1 tm
2 wwy
3 zk
4 qq
5 lm

还有一个积分表(grade_info),简况如下:
user_id grade_num type
1 3 add
2 3 add
1 1 add
3 3 add
4 3 add
5 3 add
3 1 add
第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
1 tm 4
3 zk 4
解释:
user_id为1和3的2个人,积分都为4,都要输出

示例1

输入:

drop table if exists user;
drop table if exists grade_info;

CREATE TABLE user (
id  int(4) NOT NULL,
name varchar(32) NOT NULL
);

CREATE TABLE grade_info (
user_id  int(4) NOT NULL,
grade_num int(4) NOT NULL,
type varchar(32) NOT NULL
);

INSERT INTO user VALUES
(1,'tm'),
(2,'wwy'),
(3,'zk'),
(4,'qq'),
(5,'lm');

INSERT INTO grade_info VALUES
(1,3,'add'),
(2,3,'add'),
(1,1,'add'),
(3,3,'add'),
(4,3,'add'),
(5,3,'add'),
(3,1,'add'); 

输出:

1|tm|4
3|zk|4 

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3496KB, 提交时间: 2021-09-10

select id, name, sum(grade_num) as grade_sum
from user inner join grade_info on id=user_id
group by id
having grade_sum = (select sum(grade_num) as grade_sum
                    from grade_info
                    group by user_id
                    order by grade_sum desc
                    limit 1
                   )
order by id

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3500KB, 提交时间: 2021-08-09

with zh as(
select user_id, sum(grade_num) as total
from grade_info
group by user_id )
select u.id, u.name, zh.total as grade_sum
from user u join zh on zh.user_id = u.id
where zh.total = (select max(total) from zh)
order by id

Sqlite 解法, 执行用时: 10ms, 内存消耗: 3584KB, 提交时间: 2021-12-05

select id,name,sum(grade_num) as grade_sum
from `user` left join grade_info
on `user`.id=grade_info.user_id
group by id  having grade_sum= (select sum(grade_num) r 
                    from grade_info g1 
                    group by user_id 
                    order by r desc 
                    limit 1)

Sqlite 解法, 执行用时: 11ms, 内存消耗: 3456KB, 提交时间: 2021-09-24

with new as
(
select
user_id,
sum(
    case when type='add' then grade_num
    else (-1)*grade_num
    end
) as grade_sum
from grade_info
group by user_id
)

select
user_id,
name,
grade_sum
from new 
left join user as u on new.user_id=u.id
where grade_sum=(select max(grade_sum) from new)
order by user_id 

Sqlite 解法, 执行用时: 11ms, 内存消耗: 3460KB, 提交时间: 2021-09-09

select u.id,u.name,a.s 
from (select id,s 
      from(select user_id id,sum(grade_num) s 
           from grade_info group by user_id) 
      where s=(select max(s) 
               from (select user_id id,sum(grade_num) s 
                     from grade_info 
                     group by user_id))) a 
left join user u on a.id=u.id
order by u.id