近日系统要实现总分成绩排名,而且相同分数的学生排名要一样,在网上搜了一圈,没有找到合适的方法,只能靠自己实现了,这里提供两种方法

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 查询实现成绩排名相关推荐

  1. MySQL 查询学生的总成绩并进行排名_MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况)...

    MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) MySQL查询各科成绩前三名的记录及排名(不考虑成绩并列情况) 我的表结构: 先放代码 -- 查询各科成绩前三名的记录(不考虑成绩并列情 ...

  2. MySQL查询自己的学号_Mysql 查询练习

    Mysql 查询练习 ---创建班级表 create tableclass( cidint auto_increment primary key, captionvarchar(20) )engine ...

  3. mysql怎么查询借阅相同图书_MySQL查询练习2

    MySQL查询练习2 导读: 本次MySQL的查询语句是本人考试题目: 所有题目都已通过: 该查询练习并没有sql文件进行检查: 如果有书写以及其他错误欢迎指出. 题目正文: 1.找出借书超过5本的借 ...

  4. mysql是否有缓存区_Mysql查询高速缓存区

    为了提高查询速度,Mysql会维护一个内存区域(官方文档指出,大小至少41984B)对查询结果进行缓存,当查询时发现缓存区里有数据则直接返回结果而不用去执行sql语句. 查询命中的条件 每个缓存查询至 ...

  5. mysql查询男生基本情况_MYSQL查询操作 详细

    学习目标 1 掌握select查询所有字段.指定字段的数据 2 掌握消除重复行命令distinct 3 掌握as给字段.表起别名 4 掌握条件查询where后跟比较运算符.逻辑运算符的用法 5 掌握条 ...

  6. mysql查询选修课的人数_mysql查询语句练习

    #建学生信息表student create table student ( sno varchar(20) not null primary key, sname varchar(20) not nu ...

  7. mysql查询比对提速_MySQL查询性能优化

    关注我,更多精彩文章第一时间推送给你 1.为什么查询速度会慢? ​首先对一个查询的生命周期简化分析,大致可以按照顺序分为:从客户端.到服务器.然后在服务器进行解析.生成执行计划.执行.并返回结果给客户 ...

  8. mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询

    #进阶5:分组查询 /* select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [order by 子句] 注意: 查询 ...

  9. mysql本周数据没有填充_MySql查询本周、本月、本年数据(没有数据则补全0)

    最近写项目,发现有很多图表统计,需要查询本周.本月.本年数据.但是图表需要两个数组,一个日期数组,一个数据数组.然而数据库查询却只能查询出有数据的日期数据,所以找了很多资料终于能有补全日期和数据的方法 ...

最新文章

  1. css和JavaScript
  2. linux修改arena大小,教大家Resolume Arena怎么设置大屏幕的方法
  3. Linux入门教程:Linux权限管理
  4. windows下,C++实现串口编程,串间口转发数据
  5. unity 创建图片ui_在 Unity中 将游戏数据储存至本地文档
  6. iOS开发 - Swift实现清除缓存功能
  7. LeetCode 1856. 子数组最小乘积的最大值(前缀和 + 单调栈)
  8. electron打包vue-cli4项目的解决方案1(项目实测)
  9. win10 mysql 远程访问_win10 docker部署mysql并启动远程连接
  10. [转载] Java Challengers#1:JVM中的方法重载
  11. mysql split 分割文件名_【原】mysql5.6 split函数_字符串的分割
  12. 理论知识内容有_育婴师培训课程包含哪些内容?
  13. HTML中的input type=reset标签失效(不起作用)的可能原因
  14. matlab 折射率椭球,折射率椭球详解.ppt
  15. Vue的ESLint-stylelint-prettier联合配置
  16. c语言1076素数,九度OJ 1076:N的阶乘 题解
  17. 电子电路:电流镜电路
  18. 高中计算机操作题frontpage步骤,计算机一级Frontpage操作试题
  19. 【编程实践】什么是计算机编程?定义软件开发。What is Computer Programming? Defining Software Development.
  20. 百度地图离线开发demo(热力图)

热门文章

  1. 如何使用模拟器下载荒野乱斗电脑版
  2. 单场收入过万,语音直播会是内容创业富矿吗?
  3. miui android5,MIUI论坛安卓版
  4. 如何使用烙铁:初学者指南
  5. 浙里办(H5)上传流程
  6. 工具软件中的一些操作记录
  7. 汽车理论动力性仿真-Simulink
  8. RepVGG网络简介
  9. linux防火墙的设置
  10. 台积电10nm工艺第四季度量产 追上英特尔