mysql group by分组获取每组的前N条记录
时间:2016-06-25
本文章向大家介绍mysql group by分组如何获取每组的前N(N为1,2,3...)条数据。文章给出了多种方法,这些方法各有各的优缺点,大家可以根据SQL性能来选择适合自己的方法。
先来说一下我的需求:
有一张学生表,用于存放学生考试成绩信息,包括学生ID,学生姓名,学生班级ID,学生总成绩。这张表的数据如下表所示:
student_id | student_name | class_id | total_score |
1 | Jason | 1 | 298 |
2 | yayuan | 1 | 295 |
3 | Martin | 3 | 300 |
4 | Alison | 4 | 289 |
5 | Mathews | 2 | 250 |
6 | Celia | 2 | 240 |
7 | Rice | 1 | 275 |
8 | David | 3 | 257 |
9 | Larry | 2 | 243 |
10 | zhang | 3 | 250 |
11 | wu | 4 | 255 |
12 | ge | 1 | 260 |
13 | li | 3 | 265 |
14 | meng | 4 | 279 |
15 | qiu | 1 | 272 |
16 | liu | 4 | 283 |
17 | tian | 3 | 299 |
18 | huang | 2 | 201 |
19 | nie | 1 | 228 |
20 | wang | 3 | 230 |
我们要获取每一个班级总分在前两名的学生信息,SQL语句该如何写呢?这里有三个方法:
第一种方法:
SELECT a.student_id, a.student_name, a.class_id, a.total_score
FROM student a
LEFT JOIN student b ON a.class_id = b.class_id
AND a.total_score < b.total_score
GROUP BY a.student_id, a.student_name, a.class_id, a.total_score
HAVING COUNT( b.student_id ) <2
ORDER BY a.class_id, a.total_score DESC
第二种方法:
SELECT *
FROM student a
WHERE 2 > (
SELECT COUNT( * )
FROM student
WHERE class_id = a.class_id
AND total_score > a.total_score )
ORDER BY a.class_id, a.total_score DESC
第三种方法
SELECT *
FROM student a
WHERE student_id
IN (
SELECT student_id
FROM student
WHERE class_id = a.class_id
ORDER BY total_score DESC
LIMIT 2
)
ORDER BY a.class_id, a.total_score DESC
对于第三种方法,好像有语法错误,在mysql里面,子查询里面不能使用limit,但在其他数据库里面可以用top等代替。
- 【强烈推荐】Java工程师如何从一名普通的码农成长为一位大神
- Remoting: Server encountered an internal error
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)
- 在mono 3.0 下运行ASP.NET 4网站的主意事项
- 《干货系列》SQL语句-知无不言言无不尽
- OutOfMemoryError异常系列之方法区溢出和运行时常量溢出池溢出
- 代码转换工具 Code Converter 2013
- OutOfMemoryError异常系列之Java堆溢出
- android ndk之hello world
- ScheduledExecutorService和timer的异同
- 【精心解读】关于Jupyter Notebook的28个技巧
- Web项目接口自动化测试框架搭建
- 一文读懂Hadoop、HBase、Hive、Spark分布式系统架构
- 《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- 聊一聊二分查找法
- 【Ceph】集群升级之好好看ceph.conf
- Carthage使用
- java线程池(一):java线程池基本使用及Executors
- java线程池(二):聊聊newFixedThreadPool(1)和newSingleThreadExecutor()的区别
- SAP RFC函数RFC_READ_TABLE使用与优化
- 数据库PostrageSQL-升级一个PostgreSQL集簇
- 数据库PostrageSQL-用 SSL 进行安全的 TCP/IP 连接
- 数据库PostrageSQL-使用SSH隧道的安全 TCP/IP 连接
- 快速学习-Saturn(英文版入门指引)
- Promise.all 踩坑记录
- Springboot统一返回接口+统一异常处理+后端参数校验
- 面试Java基础问题汇总 part2
- org.springframework.util.xml.SimpleSaxErrorHandler warning org.xml.sax.SAXParseException; systemId:
- 贷款违约预测-Task1 赛题理解