MySQL分组取前 N 条记录

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

字段 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)

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

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)

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

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)
(0)

相关推荐

  • MySQL 多表查询

    union 结果集合并 使用多个select分别查询不同的表,把多个select查到的记录合并在一起 一个select查到m条记录,另一个select查到n条记录,合并之后就是m+n条记录 #查询全校 ...

  • MySQL基础

    数据库的基本概念 1. 数据库的英文单词: DataBase 简称 : DB2. 什么数据库?* 用于存储和管理数据的仓库.3. 数据库的特点:1. 持久化存储数据的.其实数据库就是一个文件系统2. ...

  • MySQL学习——查询表里的数据

    MySQL学习--查询表里的数据 摘要:本文主要学习了使用DQL语句查询表里数据的方法. 数据查询 语法 1 select [distinct] 列1 [as '别名1'], ..., 列n [as ...

  • MySQL-关联查询

    一.inner join inner join 可以简写为 join,结果集是两张表中 都存在的记录,是一个交集,详情参考上面的图片. 比如:在学生表中,有一个班级ID,我们想根据班级ID,在班级表中 ...

  • mysql分组取每组前几条记录

    作者:caicai1171523597 时间: 2021-02-05 10:05:39 标签:c# [摘要]项目中经常会遇到对数据进行分组排序并取前N条的需求,比如有一张资讯表如下 CREATE TA ...

  • 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?

    写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...

  • MySQL分组查询后如何获取每组的前N条数据,你会吗?

    "分组查询"可以说是相当常见的SQL查询语句,对于MySQL数据库而言,其实现分组查询的关键字为GROUP BY,而在使用GROUP BY期间一般还会有其他的聚合函数配合使用,比如 ...

  • MySQL中查询时间最大的一条记录

    在项目中要查询用户最近登录的一条记录的 ip 直接写如下 SQL: SELECT ip,MAX(act_time) FROM users_login GROUP BY login_id; 但是这样是取 ...

  • 如何获取多个公司最近一条记录?

    问:Excel中的每行代表不同的并购事件,相同的公司会进行多次并购,筛选出每个公司最后一次并购事件,即公司代码这列把重复项的最后一项留下,没有重复的项也留下. 答:可以使用Excel的高级筛选功能来实 ...

  • 夫妻相处记住这4条,特别是前两条,以情人的方式相处,会让家庭更幸福

    夫妻相处记住这4条,特别是前两条,以情人的方式相处,会让家庭更幸福

  • EF Core怪问题之查询最后一条记录竟抛出LastOrDefault异常?

    使用EF Core查询数据库中满足条件的最后一条记录: 使用LINQ中的LastOrDefault, 代码如下: 1 public async Task<Onu> Find(string ...

  • 8.3收评:近期大盘有望直取前高

    [回顾] 下方是红茶在4月8日.5月23日.6月27日分别写到了关于未来长牛的观点,这三篇观点是一个整体不可分割.其中4月8日当天写的观点直接将变盘时间锁定在了6月下旬到7月上旬的时间里. [上午股市 ...

  • 我再论《伤寒论》前三条

    (1)太阳之为病,脉浮.头项强痛而恶寒. (2)太阳病,发热.汗出.恶风.脉缓者,名为中风. (3)太阳病,或已发热,或未发热,必恶寒.体痛.呕逆.脉阴阳俱紧者,名为伤寒. 1.<伤寒论> ...