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 ...
随机推荐
- 区间DP【p4290】[HAOI2008]玩具取名
Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用"WING"中 ...
- [BZOJ4367][IOI2014]Holiday(决策单调性+分治+主席树)
4367: [IOI2014]holiday假期 Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 421 Solved: 128[Submit][Sta ...
- Codeforces #480 Tutorial
Problem A,B,C: 简单的模拟,注意A中p mod q时对q=0特殊处理(注意范围) Problem D: Brief Intro: 给定长度为N的数组A,将A中所有连续子序列分成最少的组, ...
- 【母函数】hdu1028 Ignatius and the Princess III
大意是给你1个整数n,问你能拆成多少种正整数组合.比如4有5种: 4 = 4; 4 = 3 + 1; 4 = 2 + 2; 4 = 2 + 1 + 1; 4 = 1 + 1 + 1 + 1; ...
- 【博弈论】poj2348 Euclid's Game
假设当前b>a. 一.b%a==0 必胜 二.b<2*a,当前我们没有选择的余地,若下一步是必胜(最终能到情况一),则当前必败:反之,当前必胜. 三.b>2*a,假设x是使得b-ax ...
- python 使用mysql示例
安装MySQL驱动 由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器.MySQL官方提供了mysql-connector-p ...
- linux-统计文件中相同行的数量
cat sorttest | sort | uniq -c sorttest文件内容如下
- Linux下使用expect实现跳板机自动跳转/免密登录/自动登录(转)
shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...
- zk watch机制及创建node机制
Watch(监视) 当指定的znode或znode的子数据更改时,监视器会显示通知.你只能在 get 命令中设置watch. 语法 get /path [watch] 1 示例 get /FirstZ ...
- Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具
查了几十个网页,找到这个接近满意的解决方案http://unix.stackexchange.com/questions/146197/fdupes-delete-files-aft... 不过正则里 ...