mysql查询成绩并排名_Mysql 查询实现成绩排名
近日系统要实现总分成绩排名,而且相同分数的学生排名要一样,在网上搜了一圈,没有找到合适的方法,只能靠自己实现了,这里提供两种方法
1、sql查询实现
测试如下:
mysql> select * from score ;
+----------+--------------+---------------------+--------------+-------+
| study_no | student_name | subject_id | subject_name | score |
+----------+--------------+---------------------+--------------+-------+
| student1 | student1 | CodeCourseSubject_0 | 语文 | 120 |
| student2 | student2 | CodeCourseSubject_0 | 语文 | 110 |
| student3 | student3 | CodeCourseSubject_0 | 语文 | 110 |
| student4 | student4 | CodeCourseSubject_0 | 语文 | 80 |
| student5 | student5 | CodeCourseSubject_0 | 语文 | 81 |
| student1 | student1 | CodeCourseSubject_2 | 英语 | 150 |
| student2 | student2 | CodeCourseSubject_2 | 英语 | 130 |
| student3 | student3 | CodeCourseSubject_2 | 英语 | 130 |
| student4 | student4 | CodeCourseSubject_2 | 英语 | 44 |
| student5 | student5 | CodeCourseSubject_2 | 英语 | 45 |
+----------+--------------+---------------------+--------------+-------+
10 rows in set
首先这里对科目显示进行了行列转换,并且对以学号study_no进行分组计算总分,并且按排名排序,
sql如下:
SELECT @rownum:=@rownum+1 AS rownum,
if(@total=total,@rank,@rank:=@rownum)as rank,
@total:=total,
A.*
FROM (SELECT study_no AS studyNo,
student_name AS studentName,
SUM(score) AS total,
SUM(IF(subject_id='CodeCourseSubject_0',score,0)) AS 语文,
SUM(IF(subject_id='CodeCourseSubject_2',score,0)) AS 英语
FROM score GROUP BY study_no ORDER BY total DESC
)A,(SELECT @rank:=0,@rownum:=0,@total:=null)B
结果:
+--------+------+---------------+----------+-------------+-------+-------+-------+
| rownum | rank | @total:=total | studyNo | studentName | total | 语文 | 英语 |
+--------+------+---------------+----------+-------------+-------+-------+-------+
| 1 | 1 | 270.0 | student1 | student1 | 270.0 | 120.0 | 150.0 |
| 2 | 2 | 240.0 | student2 | student2 | 240.0 | 110.0 | 130.0 |
| 3 | 2 | 240.0 | student3 | student3 | 240.0 | 110.0 | 130.0 |
| 4 | 4 | 126.0 | student5 | student5 | 126.0 | 81.0 | 45.0 |
| 5 | 5 | 124.0 | student4 | student4 | 124.0 | 80.0 | 44.0 |
+--------+------+---------------+----------+-------------+-------+-------+-------+
5 rows in set
可见排名第二名有两个相同的分数,后面的排名自动往后移。
下面提供另外一种在程序中实现的方法:
2、程序实现
首先获得全班总分并且以降序排序
public List findAllTotalScore() {
String sql = "SELECT study_no,sum(score) AS total from score s ";
javax.persistence.Query query = em.createNativeQuery(sql);
return query.getResultList();
}
对获得的总分信息进行排序和封装成map(study_no,rank)
private Map rank(List objects) {
long previousRank = 1;
double total = 0;
//记录排名的map,map
Map rankMap = new HashMap<>();
for (int i = 0; i < objects.size(); i++) {
Object[] object = objects.get(i);
//计算名次,相同分数排名一样
if (total == (double) object[1]) {
rankMap.put(object[0].toString(), previousRank);
} else {
rankMap.put(object[0].toString(), i + 1L);
total = (double) object[1];
previousRank = i + 1;
}
}
return rankMap;
}
使用map直接根据学号就可以获得成绩排名。
mysql查询成绩并排名_Mysql 查询实现成绩排名相关推荐
- MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...
MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) 我的表结构: 先放代码 -- 查询各科成绩前三名的记录(不考虑成绩并列情 ...
- MySQL查询自己的学号_Mysql 查询练习
Mysql 查询练习 ---创建班级表 create tableclass( cidint auto_increment primary key, captionvarchar(20) )engine ...
- mysql怎么查询借阅相同图书_MySQL查询练习2
MySQL查询练习2 导读: 本次MySQL的查询语句是本人考试题目: 所有题目都已通过: 该查询练习并没有sql文件进行检查: 如果有书写以及其他错误欢迎指出. 题目正文: 1.找出借书超过5本的借 ...
- mysql是否有缓存区_Mysql查询高速缓存区
为了提高查询速度,Mysql会维护一个内存区域(官方文档指出,大小至少41984B)对查询结果进行缓存,当查询时发现缓存区里有数据则直接返回结果而不用去执行sql语句. 查询命中的条件 每个缓存查询至 ...
- mysql查询男生基本情况_MYSQL查询操作 详细
学习目标 1 掌握select查询所有字段.指定字段的数据 2 掌握消除重复行命令distinct 3 掌握as给字段.表起别名 4 掌握条件查询where后跟比较运算符.逻辑运算符的用法 5 掌握条 ...
- mysql查询选修课的人数_mysql查询语句练习
#建学生信息表student create table student ( sno varchar(20) not null primary key, sname varchar(20) not nu ...
- mysql查询比对提速_MySQL查询性能优化
关注我,更多精彩文章第一时间推送给你 1.为什么查询速度会慢? 首先对一个查询的生命周期简化分析,大致可以按照顺序分为:从客户端.到服务器.然后在服务器进行解析.生成执行计划.执行.并返回结果给客户 ...
- mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询
#进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [order by 子句] 注意: 查询 ...
- mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)
最近写项目,发现有很多图表统计,需要查询本周.本月.本年数据.但是图表需要两个数组,一个日期数组,一个数据数组.然而数据库查询却只能查询出有数据的日期数据,所以找了很多资料终于能有补全日期和数据的方法 ...
最新文章
- css和JavaScript
- linux修改arena大小,教大家Resolume Arena怎么设置大屏幕的方法
- Linux入门教程:Linux权限管理
- windows下,C++实现串口编程,串间口转发数据
- unity 创建图片ui_在 Unity中 将游戏数据储存至本地文档
- iOS开发 - Swift实现清除缓存功能
- LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)
- electron打包vue-cli4项目的解决方案1(项目实测)
- win10 mysql 远程访问_win10 docker部署mysql并启动远程连接
- [转载] Java Challengers#1:JVM中的方法重载
- mysql split 分割文件名_【原】mysql5.6 split函数_字符串的分割
- 理论知识内容有_育婴师培训课程包含哪些内容?
- HTML中的input type=reset标签失效(不起作用)的可能原因
- matlab 折射率椭球,折射率椭球详解.ppt
- Vue的ESLint-stylelint-prettier联合配置
- c语言1076素数,九度OJ 1076:N的阶乘 题解
- 电子电路:电流镜电路
- 高中计算机操作题frontpage步骤,计算机一级Frontpage操作试题
- 【编程实践】什么是计算机编程?定义软件开发。What is Computer Programming? Defining Software Development.
- 百度地图离线开发demo(热力图)