mysql实现topN top1
有时会碰到一些需求,查询分组后的最大值,最小值所在的整行记录或者分组后的top n行的记录,像在hive中是有窗口函数的,可以通过它们来实现,但是MySQL没有这些函数,可通过下面的方法来实现
1、准备
create table `test1` (
`id` int(11) not null auto_increment,
`name` varchar(20) default null,
`course` varchar(20) default null,
`score` int(11) default null,
primary key (`id`)
) engine=innodb auto_increment=10 default charset=utf8 insert into test1(name,course,score)
values
('张三','语文',80),
('李四','语文',90),
('王五','语文',93),
('张三','数学',77),
('李四','数学',68),
('王五','数学',99),
('张三','英语',90),
('李四','英语',50),
('王五','英语',89);
2、TOP 1
需求:查询每门课程分数最高的学生以及成绩
实现方法:可以通过自连接、子查询来实现,如下
a、自连接实现
select a.name,a.course,a.score
from test1 a join (select course,max(score) score from test1 group by course) b
on a.course=b.course and a.score=b.score;
执行效果如下

b、子查询实现
select name,course,score
from test1 a
where score=(select max(score) from test1 where a.course=test1.course);
执行效果如下

也可以用下面这个子查询实现
select name,course,score
from test1 a
where not exists(select 1 from test1 where a.course=test1.course and a.score < test1.score);
执行效果如下

3、TOP N
需求:查询每门课程前两名的学生以及成绩
实现方式:使用union all、自身左连接、子查询、用户变量等方式实现
a、使用union all实现
(select name,course,score from test1 where course='语文' order by score desc limit 2)
union all
(select name,course,score from test1 where course='数学' order by score desc limit 2)
union all
(select name,course,score from test1 where course='英语' order by score desc limit 2);
执行效果如下

b、使用自身左连接
select a.name,a.course,a.score
from test1 a left join test1 b on a.course=b.course and a.score<b.score
group by a.name,a.course,a.score
having count(b.id)<2
order by a.course,a.score desc;
执行效果如下

c、使用子查询
select *
from test1 a
where 2>(select count(*) from test1 where course=a.course and score>a.score)
order by a.course,a.score desc;
执行效果如下

d、使用用户变量
set @num := 0, @course := ''; select name, course, score
from (
select name, course, score,
@num := if(@course = course, @num + 1, 1) as row_number,
@course := course as dummy
from test1
order by course, score desc
) as x where x.row_number <= 2;
执行效果如下

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。
本文版权归作者,禁止转载,否则保留追究法律责任的权利。
mysql实现topN top1的更多相关文章
- 数据库之MySQL的介绍与使用20180703
/*******************************************************************************************/ 一.mysq ...
- 【mysql】一维数据TopN的趋势图
创建数据表语句 数据表数据 对上述数据进行TopN排名 select severity,sum(count) as sum from widgt_23 where insertTstamp>=' ...
- mysql 实现某年单季度内的品牌TOPn销量在此年此单季度内销量占比
数据表: 结果表: mysql语句:
- mysql分组取topn
本文来自 http://www.jb51.net/article/31590.htm 有些语句sql top n 是sqlserver语法 --按某一字段分组取最大(小)值所在行的数据 代码如下: ...
- 大数据学习——mapreduce学习topN问题
求每一个订单中成交金额最大的那一笔 top1 数据 Order_0000001,Pdt_01,222.8 Order_0000001,Pdt_05,25.8 Order_0000002,Pdt_05 ...
- mysql索引设计的注意事项
mysql索引设计的注意事项 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过key_len确定究竟使用 ...
- mysql索引设计的注意事项(大量示例,收藏再看)
mysql索引设计的注意事项(大量示例,收藏再看) 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过ke ...
- 大数据项目实践:基于hadoop+spark+mongodb+mysql+c#开发医院临床知识库系统
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
- MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
逻辑查询优化包括的技术 1)子查询优化 2)视图重写 3)等价谓词重写 4)条件简化 5)外连接消除 6)嵌套连接消除 7)连接消除 8)语义优化 9)非SPJ优化 一.子查询优化 1. ...
随机推荐
- Effective C++ 条款 50:了解new和delete的合理替换时机
(一) 为什么有人想要替换operator new 和 operator delete呢?三个常见的理由: (1)用来检測运用上的错误. (2)为了强化效果. (3)为了收集使用上的统计数据. (二) ...
- php内置的http server, 类似于nodejs里面和golang里面的
原文:https://www.sitepoint.com/taking-advantage-of-phps-built-in-server/ ----------------------------- ...
- 友元程序集(C# 和 Visual Basic)
友元程序集(C# 和 Visual Basic) Visual Studio 2013 “友元程序集”是一种能够访问其他程序集的 Friend (Visual Basic) 或 internal (C ...
- HTTP协议响应消息的常用状态码【转】
“100″ : Continue(继续) 初始的请求已经接受,客户应当继续发送请求的其余部分.(HTTP 1.1新) “101″ : Switching Protocols(切换协议) 请求者已要求服 ...
- 架构设计:系统间通信(20)——MQ:消息协议(下)
(接上文<架构设计:系统间通信(19)--MQ:消息协议(上)>) 上篇文章中我们重点讨论了"协议"的重要性.并为各位读者介绍了Stomp协议和XMPP协议. 这两种协 ...
- SQL语言 之 SQL概述
SQL(Structured Query Language)语言,自1987年6月被国际标准化组织采纳为国际标准,SQL语言成为关系数据库的标准语言. SQL语言是关系数据库操作的基础语言,将数据查询 ...
- 根据wsdl文件生成java代码
具体操作步骤: 1. 运行cmd命令 输入 C:\jdk-1_6_0_31\bin (根据自己的JDK的安装位置而定) 2. 新建gen.bat文件 3. gen.bat文件内容为:wsimpo ...
- Windows 开发之VC++垃圾清理程序软件
概述 本程序软件的主要实现垃圾文件清理的功能,即对指定的文件格式的临时文件或垃圾文件进行遍历.扫描.显示.删除清理等功能.在程序界面设计方面,对默认对话框重新自定义绘制,主要包括标题栏的重绘.对话框边 ...
- Okhttp实用封装
概述 对okhttp的get,put,delete,post请求简单封装,减少了不必要的冗余代码 详细 代码下载:http://www.demodashi.com/demo/11101.html 在自 ...
- Mysql字符串中有数字的排序问题
此方法是我见过最聪明的写法,不过不知道有没有隐含的bug: 参考地址 select id, col from tableName order by length(col) asc, col asc这种 ...