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 ...
随机推荐
- csu1216( Trie )
csu1216 题意 给定一些数,求这些数中两个数的异或值最大的那个值. 分析 转化成二进制数存入字典树,比如说要查询 \(0011\) ,显然和 \(1100\) 结合最优,所以我们直接在字典树上寻 ...
- 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏
#include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...
- SciPy中两个模块:io 和misc
读写.mat文件 如果你有一些数据,或者在网上下载到一些有趣的数据集,这些数据以Matlab的.mat 文件格式存储,那么可以使用scipy.io 模块进行读取. data = scipy.io.lo ...
- Exercise02_01
import java.util.Scanner; public class Out { public static void main(String[] args){ Scanner input = ...
- C# 二维码扫描
Zint类用于产生二维码.https://sourceforge.net/projects/zint/ Zxing类用于读取二维码. https://github.com/zxing/zxing AF ...
- mysql用unix时间戳统计一个日期段的数据
select DATE_FORMAT(FROM_UNIXTIME(date),'%Y-%m-%d') as d, count(*) as c from tb where (FROM_UNIXTIME( ...
- ASP.NET MVC快速开发框架清新简洁界面设计,有兴趣可以模仿参考
软件的用户体验很重要,要抓住用户的心,这篇博文分享一下最近一个项目的UI设计. 我做UI设计是从用户的角度出发的,要去揣摩用户的习惯. 大部分用户都是使用windows操作系统,所以我这套软件的风格也 ...
- 前端:微信支付和支付宝支付在pc端和h5页面中的应用
1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html 中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...
- leetcode练习之No.1------ 两数之和Two Sum
github地址:git@github.com:ZQCard/leetcode.git 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能 ...
- scrapy-splash抓取动态数据例子十五
一.介绍 本例子用scrapy-splash爬取电视之家(http://www.tvhome.com/news/)网站的资讯信息,输入给定关键字抓取微信资讯信息. 给定关键字:数字:融合:电视 抓取信 ...