题解 | #获得积分最多的人(三)#
获得积分最多的人(三)
http://www.nowcoder.com/practice/d2b7e2a305a7499fb310dc82a43820e8
# 题目:查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序
# 明确问题:查找积分最高用户的ID,然后对应到名字,以及总积分
# 由于现在的grade_info类型多了减分的,所有总积分是用ADD的合计减去REDUCE的合计
# 那么我们先看每个用户add多少分,reduce多少分,然后相减得出实际总积分,注意使用left join
# 然后相减的时候记得把匹配不到的作为0,这样才是最终的总积分
# 连接USER表即可,我这个办法是有笨但是我相对来说好理解,应该有更好的解决办法
# 明确问题:查找积分最高用户的ID,然后对应到名字,以及总积分
# 由于现在的grade_info类型多了减分的,所有总积分是用ADD的合计减去REDUCE的合计
# 那么我们先看每个用户add多少分,reduce多少分,然后相减得出实际总积分,注意使用left join
# 然后相减的时候记得把匹配不到的作为0,这样才是最终的总积分
- select a.user_id,a.grade_num1-ifnull(b.grade_num2,0) as final_grade
- from
- (
- select user_id,sum( grade_num) grade_num1
- from grade_info
- where type='add'
- group by user_id
- )a
- left join
- (
- select user_id,sum( grade_num) grade_num2
- from grade_info
- where type='reduce'
- group by user_id
- ) b
- on a.user_id=b.user_id;
# 连接USER表即可,我这个办法是有笨但是我相对来说好理解,应该有更好的解决办法
- select z.id,z.name,x.final_grade as grade_num
- from
- (
- SELECT user_id,final_grade,rank()over(order by final_grade desc) t_rank
- FROM
- (
- select a.user_id,a.grade_num1-ifnull(b.grade_num2,0) as final_grade
- from
- (
- select user_id,sum( grade_num) grade_num1
- from grade_info
- where type='add'
- group by user_id
- )a
- left join
- (
- select user_id,sum( grade_num) grade_num2
- from grade_info
- where type='reduce'
- group by user_id
- ) b
- on a.user_id=b.user_id
- ) f
- )x
- join user z
- on x.user_id=z.id
- where x.t_rank=1
查看11道真题和解析