转载  https://blog.csdn.net/jslcylcy/article/details/72627762

score表:

CREATE TABLE `score` (
`student_id` int(10) DEFAULT NULL,
`class_id` int(10) DEFAULT NULL,
`score` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  • 1
  • 2
  • 3
  • 4
  • 5

字段 student_id 学生 id ,class_id:班级 id ,score:分数 
数据准备:

insert into score values(1,1,100),(2,1,93),(3,1,89),(4,1,96),(5,2,98),(6,2,97),(7,2,90),(8,2,88),(9,1,96);

表结构如下:

mysql> select * from score;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 2 | 1 | 93 |
| 3 | 1 | 89 |
| 4 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
| 7 | 2 | 90 |
| 8 | 2 | 88 |
| 9 | 1 | 96 |
+------------+----------+-------+
9 rows in set (0.00 sec)

1.取每个班级前两名的学生(包含并列第二名)

mysql> select * from score s1 where (select count(0) from score s2 where s1.class_id = s2.class_id and s1.score < s2.score) < 2;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 4 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
| 9 | 1 | 96 |
+------------+----------+-------+
5 rows in set (0.00 sec)

sql 解释:取表 s1的数据,这些数据中 class_id 和 s2 class_id相同的数据下,比 s1的 score 分数大的 s2的数据条目必须小于2

或者使用 left join 的方式:

mysql> select s1.* from score s1 left join score s2 on s1.class_id = s2.class_id and s1.score<s2.score group by s1.class_id,s1.student_id,s1.score having count(s2.student_id)<2;
+------------+----------+-------+
| student_id | class_id | score |
+------------+----------+-------+
| 1 | 1 | 100 |
| 4 | 1 | 96 |
| 9 | 1 | 96 |
| 5 | 2 | 98 |
| 6 | 2 | 97 |
+------------+----------+-------+
5 rows in set (0.00 sec)

2.取学生分数数据且表示排名

mysql> select s1.*,(select count(0) + 1 from score s2 where s2.score > s1.score)rank from score s1;
+------------+----------+-------+------+
| student_id | class_id | score | rank |
+------------+----------+-------+------+
| 1 | 1 | 100 | 1 |
| 2 | 1 | 93 | 6 |
| 3 | 1 | 89 | 8 |
| 4 | 1 | 96 | 4 |
| 5 | 2 | 98 | 2 |
| 6 | 2 | 97 | 3 |
| 7 | 2 | 90 | 7 |
| 8 | 2 | 88 | 9 |
| 9 | 1 | 96 | 4 |
+------------+----------+-------+------+
9 rows in set (0.00 sec)

sql解释:将 s2中比s1中分数大的条目显示出来就行了(count 时需要加1)

3.取学生成绩数据,表示班级排名

mysql> select s1.*,(select count(0) + 1 from score s2 where s1.class_id = s2.class_id and s2.score > s1.score)rank from score s1 order by class_id,rank;
+------------+----------+-------+------+
| student_id | class_id | score | rank |
+------------+----------+-------+------+
| 1 | 1 | 100 | 1 |
| 4 | 1 | 96 | 2 |
| 9 | 1 | 96 | 2 |
| 2 | 1 | 93 | 4 |
| 3 | 1 | 89 | 5 |
| 5 | 2 | 98 | 1 |
| 6 | 2 | 97 | 2 |
| 7 | 2 | 90 | 3 |
| 8 | 2 | 88 | 4 |
+------------+----------+-------+------+
9 rows in set (0.00 sec)

与之前一样,但过滤条件中只需要计算班级相同的数据条目

4.取每个班级前两名(并列的只取前面的数据)

mysql学生成绩排名,分组取前 N 条记录的更多相关文章

  1. ORACLE/MYSQL/DB2等不同数据库取前几条记录

    选取数据库中记录的操作是最基础最频繁的,但往往实际应用中不会这么简单,会在选取记录的时候加上一些条件,比如取前几条记录,下面就总结了如何在ORACLE/MYSQL/DB2等一些热门数据库中执行取前几条 ...

  2. mysql使用GROUP BY分组实现取前N条记录的方法

    MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...

  3. MySql多表关联,根据某列取前N条记录问题

    近来遇到一个问题:“MySql多表关联,根据某列取前N条记录”. 刚开始一直在想,SQL语句是否可以做到直接查询出来,但几经折磨,还是没能写出SQL语句,-------如果有大牛的话,望指点迷津.我把 ...

  4. MySQL中的RAND()函数使用详解(order by rand() 随机查询取前几条记录)

    MySQL RAND()函数调用可以在0和1之间产生一个随机数: mysql> SELECT RAND( ), RAND( ), RAND( ); +------------------+--- ...

  5. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  6. Oracle 取前几条记录

    今天看了篇文章,对oracle取前几条数据的方式和说明,总结比较全,学习了,做个记录点.oracle 取前10条记录 以下内容是原始文章内容,用于做留存阅读. 1.oracle 取前10条记录 1) ...

  7. 当前时间、前n天、后n天、取前n条记录、从第n条开始取m条

    当前时间:NOW() 前n天:DATE_SUB(NOW(),INTERVAL n DAY) 后n天:DATE_SUB(NOW(),INTERVAL -n DAY) 取前n条记录:SELECT * FR ...

  8. mysql 分组统计、排序、取前N条记录解决方案

    需要在mysql中解决记录的分组统计.排序,并抽取前10条记录的功能.现已解决,解决方案如下: 1)表结构 CREATE TABLE `policy_keywords_rel` ( `id` int( ...

  9. MSSQL—按照某一列分组后取前N条记录

    以前在开发的时候遇到过一个需求,就是要按照某一列进行分组后取前几条数据,今天又有同事碰到了,帮解决了之后顺便写一篇博客记录一下. 首先先建一个基础数据表,代码如下: IF OBJECT_ID(N'Te ...

随机推荐

  1. ckfinder的使用

    引入<script type="text/javascript" src="${ctxStatic}/ckfinder/ckfinder.js">& ...

  2. 第五小节之GUI(图形用户界面)

    GUi:全程是Graphical User Interface,即图形用户界面,就是应用程序提供给用户操作的图形界面,包括窗口.菜单.按钮.工具栏和其它各种图形界面元素.提供了丰富的类,这些类分别位于 ...

  3. jQuery+Ajax实现图片的预览和上传

    jQuery+Ajax实现图片的预览和上传 1.配置Spring-web.xml <!-- springmvc上传图片 --> <bean id="multipartRes ...

  4. Linux20期学习笔记 Day2

    Linux系统进程状态及部分基础命令

  5. Spring注解配置、Spring aop、整合Junit——Spring学习 day2

    注解配置: 1.为主配置文件引入新的命名空间(约束) preference中引入文件 2.开启使用注解代理配置文件 <?xml version="1.0" encoding= ...

  6. Codeforces1238F. The Maximum Subtree(树形dp)

    题目链接:传送门 思路: 题意说用线段的相交作为边,来构造树,所以不存在大于等于3个的线段两两相交,否则会构成环.因而构造出的树中,每个点最多只会与2个度大于1的节点相邻. 不妨把1设为树根,用deg ...

  7. 文件上传 MIME类型检测

    简介 MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏 ...

  8. svn 服务器的搭建以及客户端的使用

    1.svn 服务器的搭建以及客户端的使用,安装见下面的博客 https://blog.csdn.net/zh123456zh789/article/details/80921179 说明:服务器只是用 ...

  9. 【30分钟学完】canvas动画|游戏基础(7):动量守恒与多物体碰撞

    前言 一路沿着本系列教程学习的朋友可能会发现,前面教程中都尽量避免提及质量的概念,很多运动概念也时刻提醒大家这不是真实的物体运动.因为真实的物体运动其实跟质量都是密不可分的,而且质量的引入自然必须提及 ...

  10. 用class语法派生Enum并增加描述值的类属性来定义一个新枚举

    import enum class BugStatus(enum.Enum):        new = 7    incomplete = 6    invalid = 5    wont_fix ...