mysql查询总分前10名_MySQL查询总积分前⼗的⽤户信息和
总分
需求
这是前天看见的⼀个⾯试题。
网上银行登录安全控件下载
在这⾥有两个表,⼀个⽤户表和⼀个⽤户积分记录表。
需求分析
⽬的
到总积分前10的⽤户和⽤户信息
现有条件
⽤户表和积分记录表,唯⼀的联系就是会员uid。
需求实现
新建两个表webservice有什么用
⽤户表
积分记录表
积分表⽤户积分求和
select uid, SUM(score) as total from scoreTb group by uid;
结果
这⾥⽤到了SUM()求和函数和group分组。
求和后排序mysql面试题常问
需求是求前10的,这⾥数据量没那么⼤就求前5把,既然是前5,我们就降序排列。这⾥就要使⽤MySQL排序了。
使⽤ ORDER BY ⼦句将查询数据排序后再返回;
ASC:升序(默认)
DESC :降序。
根据总积分排序,那么我需要使⽤求和后的总积分了。
select uid, SUM(score) as total from scoreTb group by uid order by total desc;
到前5个
这⾥总积分有了,排序也有了。剩下的是到总积分排序中的前5个。
需要使⽤MySQL的LIMIT了。
LIMIT⼦句接受⼀个或两个参数。两个参数的值必须为零或正整数。
LIMIT offset , count;
offset:参数指定要返回的第⼀⾏的偏移量。第⼀⾏的偏移量为0,⽽不是1。
count:指定要返回的最⼤⾏数。
但是LIMIT 0,count和LIMIT count是⼀样的结果,取表中的前count⾏。
select uid, SUM(score) as total from scoreTb group by uid order by total desc limit 5;
腾讯前端面试题这⾥我们就取到了积分表中总积分前5的了,但是还不知道⽤户信息。
查⽤户信息
这⾥我们希望是通过前⾯到的总分前5的uid来⽤户信息,然后把结果拼接在⼀起输出。既然是两个表的结果拼接就需要LEFT JOIN。那么sql语句就是这样的了:
select * from userTb t left join (select uid, SUM(score) as total from scoreTb group by uid order by total desc limit 5) tab on t.uid=tab.uid;
这⾥其实我们已经到了总分前5的⼈的信息了。但是结果似乎有点问题。
问题分析
这⾥我们先看看上⾯的sql语句的逻辑:
1.根据⽤户uid求⽤户总积分;
2.根据总积分按照降序排列;
3.取上⾯获得的数据中的前5个;
4.根据上⾯的结果去⽤户表查,结果做链接在⼀起输出。
这个过程似乎没任何问题,但是实际的查询结果却输出了下⾯那些NULL我们不需要的数据。但是这⾥为什么?我也不知道原因。
解决问题
解决问题就只能换个思路了。
先对⽤户积分表排序排序,然后根据这个结果去⽤户表,最后的结果在输出前5条。
select * from userTb t left join (select sum(score) as my_score,uid from scoreTb group by uid order by my_score desc) tab on tab.uid = t.uid limit 5;
瀑布流插件是什么这样就好了。
其他
// 修改字段类型
alter table userTb modify column uid(字段名) text(字段类型);
// 修改字段名
html怎么设置空格长度alter table scoreTb change name(原字段名) score(⽬标字段名) text(字段类型);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。