表定义 及 测试数据

CREATE TABLE `score_info` (  `student_id` int NOT NULL AUTO_INCREMENT,  `category` varchar(255) DEFAULT NULL,  `score` int DEFAULT NULL,  PRIMARY KEY (`student_id`)) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;INSERT INTO `score_info` VALUES ('1', '语', '99');INSERT INTO `score_info` VALUES ('2', '数', '32');INSERT INTO `score_info` VALUES ('3', '外', '88');INSERT INTO `score_info` VALUES ('4', '语', '89');INSERT INTO `score_info` VALUES ('5', '数', '57');INSERT INTO `score_info` VALUES ('6', '外', '67');INSERT INTO `score_info` VALUES ('7', '语', '72');INSERT INTO `score_info` VALUES ('8', '数', '48');INSERT INTO `score_info` VALUES ('9', '外', '53');INSERT INTO `score_info` VALUES ('10', '语', '96');INSERT INTO `score_info` VALUES ('11', '数', '69');INSERT INTO `score_info` VALUES ('12', '数', '39');INSERT INTO `score_info` VALUES ('13', '外', '93');INSERT INTO `score_info` VALUES ('14', '数', '39');INSERT INTO `score_info` VALUES ('15', '外', '93');INSERT INTO `score_info` VALUES ('16', '语', '96');INSERT INTO `score_info` VALUES ('17', '数', '39');INSERT INTO `score_info` VALUES ('18', '语', '96');INSERT INTO `score_info` VALUES ('19', '数', '88');INSERT INTO `score_info` VALUES ('20', '语', '77');INSERT INTO `score_info` VALUES ('21', '数', '54');INSERT INTO `score_info` VALUES ('22', '外', '73');INSERT INTO `score_info` VALUES ('23', '数', '96');

查询结果

  • 根据分数排名(分数相同 按先后排序)
SELECTt.student_id,t.category,t.score,t.rowNumberFROM(SELECTs.*,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3
  • 根据分数排民(分数相同并列)
SELECTt.category,t.score,t.studentIds,t.rowNumberFROM(SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3

思路

要在一张包含学生ID、成绩、课程的表中检索出每门课程的前三名

1)、分组课程,再按成绩排序

SELECTs.*,@rowNumber :=@rowNumber + 1 rowNumberFROMscore_info s,(SELECT @rowNumber := 0) rORDER BYcategory DESC,score DESC;

2)、要根据不同的课程各自排序,要先获取到“上一条数据”的课程类型

SELECTs.*,@rowNumber :=@rowNumber + 1 rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC;

3)、已经获取到上一条数据的课程类型,那就可以用当前课程比对上一条课程,判断是否重新排序

SELECTs.*,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rORDER BYcategory DESC,score DESC;

4)、分组课程和成绩,实现 课程相同 且 成绩相同的排名并列(根据需求 自行决定是否需要并列)

SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC

5)、已经可以获取到各科成绩排名,要获取前三名 可以直接where rowNumber<=3 ,即可实现检索各科前三名

SELECTt.category,t.score,t.studentIds,t.rowNumberFROM(SELECTs.category,s.score,GROUP_CONCAT(s.student_id) studentIds ,@rowNumber := (CASEWHEN @categoryName = s.category THEN@rowNumber + 1ELSE1END) rowNumber ,@categoryName categoryNameBefor ,@categoryName := category categoryNameAfterFROMscore_info s,(SELECT@rowNumber := 0 ,@categoryName := '--') rGROUP BYcategory,scoreORDER BYcategory DESC,score DESC) tWHEREt.rowNumber <= 3

sql 包含_SQL笔记:在一张包含学生ID、课程、成绩的表中,检索各科前三名相关推荐

  1. 编写SQL语句,从Customers表中检索所有的ID(cust_id)

    问题: 编写SQL语句,从Customers表中检索所有的ID(cust_id) 答案: SELECT cust_idFROM Customers; SQL语句中用来检索信息的就是SELECT语句了. ...

  2. SQL查询——各科前三名的成绩(改良版)

    SQL查询--各科前三名的成绩 表结构 查询代码 思路 小结 表结构 //临时表 cerate table id( id number ) //选课表 cerate table sc( sid num ...

  3. SQL Cookbook:一、检索记录(1)从表中检索所有行和列

    问题 查看一个表中的所有数据. 解决方案     对表使用SELECT语句并使用特殊字符"*". select * from emp 讨论     SQL中的"*&quo ...

  4. 【sql: 练习题 28 ,29】查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况),查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数...

    题目:查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况) 分析: 这个应该是student表 和  student_score表进行联合查询,因为存在学生没成绩,没选课的情况,所以要用lef ...

  5. mysql 查询姓张或者姓王_题目:MySql数据查询题目(学生和课程成绩)

    1)     创建student和score表 2)     为student表和score表增加记录 3)     查询student表的所有记录 SELECT * from student 4)  ...

  6. sql 脚本编写之路 常用语句(一) 1.用一个表中的某一列更新另外一个表的某些列:...

    for ACCESS 数据库:update a, b set a.name=b.name1 where a.id=b.idfor SQL Server 数据库: update a set a.name ...

  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 13丨每位学生的最高成绩【难度中等】

     活动介绍: 「数据仓库技术交流群」已经正式启动每日SQL打卡,帮助大家扎实基础,努力工作之余,别忘了自我提升.另有超多CSDN 周边礼物相送. 欢迎报名和邀请小伙伴参与,一个人可能走得很快,但一群人 ...

  8. SQL Cookbook:一、检索记录(2)从表中检索部分行

    问题     从表中查询满足特定条件的行. 解决方案 使用WHERE字句指定要保留哪些行.例如,要查看部门号码为10的所有员工的信息. select * from emp where deptno = ...

  9. 一个mybatis动态 SQL查询的完整小案例。包含多表联合查询。

    多表联合查询 一个根据机场查询航线的例子.有两张表,机场表包含机场信息:机场id.机场名字.机场城市. 航班包含航线信息:航班id.飞机编号.飞行时间.票价.起飞机场id.降落机场id. 需要查询的结 ...

最新文章

  1. Oracle 高效分页
  2. 全球十大AI领军人物
  3. C#基础知识整理:基础知识(10) 静态
  4. Windows10 家庭版添加【本地组策略编辑器】
  5. 用eval在txt中存储list,dict,tuple
  6. 【数据库学习笔记】——cursor游标对象
  7. 企业即时通讯软件2013 即时通讯大手笔
  8. 你为什么选择考研,考研对你的意义是什么?
  9. 【OpenCV应用】python处理行李图像匹配项目——图像(简单)清晰化
  10. Oracle常用诊断事件清单
  11. rk399_android7.1的mipi驱动代码追踪(部分)
  12. 16.UNIX 环境高级编程--网络IPC:套接字
  13. TIA博途中如何设置不需要初始化DB块也可以下载?
  14. DAV 转 AVI 软件 dav2avi
  15. 天津互联网公司和生活成本
  16. C语言 单引号和双引号
  17. (statistic)你所不知道的P值--对统计学的批判
  18. 学计算机电脑屏幕多大,买电脑显示器的技巧 电脑显示屏多大尺寸好
  19. 什么是自然语言处理(NLP)?
  20. 利用计算机审计新闻,计算机审计显身手 审计员钻出账本堆被审单位麻烦减少...

热门文章

  1. bin/...的访问被拒绝被拒绝的问题
  2. Failed to create the Java Virtual Machine
  3. Axure RP 简介
  4. 用grep和cut做一些数据统计
  5. redis和kafka读取代码
  6. Laravel 队列:如何查看队列报错信息
  7. MySQL的distinct:去重
  8. Linux实验三父子进程每隔3秒,实验三进程的创建和简单控制(学生分析.doc
  9. rip协议中周期性广播路由信息的报文_距离矢量路由协议(RIP)
  10. word2003如何设置护眼模式_连锁企业如何设置「单店盈利模式」?