mysql分组取最大(最小、最新、前N条)条记录
在数据库开发过程中,我们要为每种类型的数据取出前几条记录,或者是取最新、最小、最大等等,这个该如何实现呢,本文章向大家介绍如何实现mysql分组取最大(最小、最新、前N条)条记录。需要的可以参考一下。
先看一下本示例中需要使用到的数据
创建表并插入数据:
CREATE TABLE `tb` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
`val` int(11) DEFAULT NULL,
`memo` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
insert into tb values('a', 2, 'a2');
insert into tb values('a', 1, 'a1');
insert into tb values('a', 3, 'a3');
insert into tb values('b', 1, 'b1');
insert into tb values('b', 3, 'b3');
insert into tb values('b', 2, 'b2');
insert into tb values('b', 4, 'b4');
insert into tb values('b', 5, 'b5');
数据表如下:
| name | val | memo |
| a | 2 | a2 |
| a | 1 | a1 |
| a | 3 | a3 |
| b | 1 | b1 |
| b | 3 | b3 |
| b | 2 | b2 |
| b | 4 | b4 |
| b | 5 | b5 |
按name分组取val最大的值所在行的数据
方法一:
select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
方法三:
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
方法四:
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by
方法五:
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
方法六:
select * from (select * from tb ORDER BY val desc) temp GROUP BY name ORDER BY val desc;
以上六种方法运行的结果均为如下所示:
| name | val | memo |
| a | 3 | a3 |
| b | 5 | b5 |
小编推荐使用第一、第三、第四钟方法,结果显示第1,3,4种方法效率相同,第2,5种方法效率差些。
按name分组取val最小的值所在行的数据
方法一:
select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
方法二:
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
方法三:
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
方法四:
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
方法五:
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
以上五种方法运行的结果均为如下所示:
| name | val | memo |
| a | 1 | a1 |
| b | 1 | b1 |
按name分组取第一次出现的行所在的数据
sql如下:
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
//这个是sql server的
//mysql应该是
select a.* from tb a where val = (select val from tb where name = a.name limit 1) order by a.name
结果如下:
| name | val | memo |
| a | 2 | a2 |
| b | 1 | b1 |
-----下面的没有验证-- 感觉是sql-server的写法,mysql的随机是rand(),前几条记录是limit N.
按name分组随机取一条数据
sql如下:
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
结果如下:
| name | val | memo |
| a | 1 | a1 |
| b | 3 | b3 |
按name分组取最小的两个(N个)val
第一种方法:
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
第二种方法:
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
第三种方法:
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name
结果如下:
| name | val | memo |
| a | 1 | a1 |
| a | 2 | a2 |
| b | 1 | b1 |
| b | 2 | b2 |
按name分组取最大的两个(N个)val
第一种方法:
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
第二种方法:
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
第三种方法:
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name
结果如下:
| name | val | memo |
| a | 3 | a3 |
| a | 2 | a2 |
| b | 5 | b5 |
| b | 4 | b4 |
转:http://www.manongjc.com/article/1082.html
同样问题:http://www.cnblogs.com/fps2tao/p/9038268.html
mysql分组取最大(最小、最新、前N条)条记录的更多相关文章
- mysql 分组取每个组的前几名的问题
select *from hotel_addition_orders awhere (select count(*) from hotel_addition_orders where hotel_or ...
- mysql分组取每组前几条记录(排名)
1.创建表 create table tb( name varchar(10), val int, memo varchar(20) ); 2.插入数据 insert into tb values(' ...
- mysql分组取topn
本文来自 http://www.jb51.net/article/31590.htm 有些语句sql top n 是sqlserver语法 --按某一字段分组取最大(小)值所在行的数据 代码如下: ...
- sql 分组取每组的前n条或每组的n%(百分之n)的数据
sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...
- mysql 分组取最新的一条记录(整条记录)
方法:mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了 #select * from ...
- mysql分组取前N记录
http://blog.csdn.net/acmain_chm/article/details/4126306 http://bbs.csdn.net/topics/390958705 1 我只用到了 ...
- mysql分组取每组前几条记录(排序)
首先来造一部分数据,表mygoods为商品表,cat_id为分类id,goods_id为商品id,status为商品当前的状态位(1:有效,0:无效). CREATE TABLE `mygoods` ...
- MySQL分组查询每组最新的一条数据(通俗易懂)
开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录): sql如下: -- ---------------------------- -- Table structu ...
- mysql分组取每组大的记录
SELECT a.* FROM chat_log a INNER JOIN (SELECT MAX(id) id,to_user FROM chat_log GROUP BY to_user)b ON ...
随机推荐
- Vim求生
[TOC] Vim 是从 vi 发展出来的一个文本编辑器.其代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器. —— ...
- [BZOJ4650][NOI2016]优秀的拆分(SAM构建SA)
关于解法这个讲的很清楚了,主要用了设关键点的巧妙思想. 主要想说的是一个刚学的方法:通过后缀自动机建立后缀树,再转成后缀数组. 后缀数组功能强大,但是最令人头疼的地方是模板太难背容易写错.用这个方法, ...
- [CTSC2017]游戏(Bayes定理,线段树)
传送门:http://uoj.ac/problem/299 题目良心给了Bayes定理,但对于我这种数学渣来说并没有什么用. 先大概讲下相关数学内容: 1.定义:$P(X)$ 表示事件$X$发生的概率 ...
- kill -3 获取threaddump信息
有些Java应用服务器是在控制台上运行,如Weblogic,为了方便获取threaddump信息,在weblogic启动的时候,会将其标准输出重 定向到一个文件,用"nohup ./star ...
- Ubuntu 16.04屏幕阅读Screen Reader导致快捷键失灵的问题解决
开启和关闭快捷键:[Alt]+[Win]+[S] 如果关了之后开机还自动启动时,那么直接把它卸载: sudo apt-get remove gnome-orca killall orca 参考: ht ...
- windbg --sqlserver 实例 转
http://blog.csdn.net/obuntu/article/details/5962378 SQLSERVER DUMP 调试 在下面的对话框输入 ~ 会出现线程的信息 0:000> ...
- 看懂ios命名规则
http://liangrui.blog.51cto.com/1510945/509289/ http://daniellee520.blog.51cto.com/372529/229615
- 学习web前端之神器sublime text 3
第一次在博客园写博客,以前都是看别人写的技术在自己慢慢的学习.现在想自己把每天学习的东西理解并记录下来,加深下印象以后可以做个回顾.不知道自己能否坚持每周至少写2篇博文. 古话说的好:工欲善其事,必先 ...
- zk删除node模式
检查状态 状态描述指定的znode的元数据.它包含时间戳,版本号,ACL,数据长度和子znode等细项. 语法 stat /path 示例 stat /FirstZnode 输出 [zk: local ...
- 自定义WebViewPage,实现Url.Action生成绝对地址
前言 运营部门一直对公司官网SEO有意见,认为做得不好(说得好像运营做不好都是seo似的).为此两部门老大还闹到CEO那去了. 也因为这事,工作计划终于排上日程.沟通一番后得知有如下几点需求: 1.所 ...