MySQL取每组的前N条记录
一、对分组的记录取前N条记录:例子:取前 2条最大(小)的记录
.用子查询:
SELECT * FROM right2 a WHERE >
(SELECT COUNT(*) FROM right2 b WHERE b.id=a.id AND b.account>a.account)
ORDER BY a.id,a.account DESC
.用exists半连接:
SELECT * FROM right2 a WHERE EXISTS
(SELECT COUNT(*) FROM right2 b WHERE b.id=a.id AND a.account<b.account HAVING COUNT(*)<)
ORDER BY a.id,a.account DESC
同理可以取组内最小的N条记录:
SELECT * FROM right2 a WHERE >
(SELECT COUNT(*) FROM right2 b WHERE b.id=a.id AND b.account<a.account)
ORDER BY a.id,a.account DESC
用exists:
SELECT * FROM right2 a WHERE EXISTS
(SELECT COUNT(*) FROM right2 b WHERE b.id=a.id AND a.account>b.account HAVING COUNT(*)<)
ORDER BY a.id,a.account DESC
如果取每组的最大(小)一条记录我常用:
select t1.* from table t inner join(select * from table t1 order by id desc) t1 on t.id=t1.id group by t.id order by t.id; //一定用t1.*,用t.*不OK
二.实例:取每组最大的前 N条
create table t2 (
id int primary key,
gid char,
col1 int,
col2 int
) engine=innodb;
insert into tx01 values
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,),
(,'A',,),
(,'B',,),
(,'C',,),
(,'D',,),
(,'E',,);
create table tx01 (
id int primary key,
gid char,
col1 int,
col2 int
) engine=innodb;
取每组gid 最大的前N条记录:使用自连接或则半连接:
*N=1时:
自连接:降序排好后group by取每组最大的一条。
select * from (select * from t2 order by col2 desc)as a group by gid order by gid;
半连接方式:找不到比最大值还大的。
select * from t2 a where not exists(select from t2 b where b.gid=a.gid and b.col2>a.col2) order by a.gid;
*N=3时:
自连接:
select * from t2 a where >(select count(*) from t2 where gid=a.gid and col2>a.col2) order by a.gid,a.col2 desc;
半连接:
select * from t2 a where exists(select count(*) from t2 b where b.gid=a.gid and a.col2<b.col2 having(count(*))<) order by a.gid,a.col2 desc
转:本文出自 http://huanghualiang.blog.51cto.com/6782683/1252630
MySQL取每组的前N条记录的更多相关文章
- sql 用Group by分组后,取每组的前几条记录
转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/ --查询每门课程的前2名成绩 CREATE TABLE S ...
- 用Group by分组后,取每组的前3条记录,怎么取?
使用子查询进行查询 SELECT * FROM home_content a WHERE ( SELECT count(id) FROM home_content WHERE class_link = ...
- sql 分组取每组的前n条或每组的n%(百分之n)的数据
sql 分组取每组的前n条或每组的n%(百分之n)的数据 sql keyword: SELECT * ,ROW_NUMBER() OVER(partition by b.UserID order by ...
- sql 分组后显示每组的前几条记录
sql 分组后显示每组的前几条记录 如 表中记录是 code serialno A1 1 ...
- mysql查询各种类型的前N条记录
mysql查询各种类型的前N条记录,将3改为N(需查询条数)即可 (select * from event_info where event_type = 1 limit 3)union all( ...
- mysql获取所有分类的前n条记录的两种方法浅析
项目中有个需求是获取出展会分类下的前n条展商. 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第一次获取出展会的时候也获取所有的每个展会分类下的 ...
- sqlServer 取每组的前几条数据
首先的建表语句: ) DROP TABLE [test] CREATE TABLE [test] ( [id] [, ) NOT NULL , [name] [nvarchar] () NULL , ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...
- mysql使用GROUP BY分组实现取前N条记录的方法
MySQL中GROUP BY分组取前N条记录实现 mysql分组,取记录 GROUP BY之后如何取每组的前两位下面我来讲述mysql中GROUP BY分组取前N条记录实现方法. 这是测试表(也不知道 ...
随机推荐
- IOS APP开发中View的几种实现方式
xib文件有以下几个重要的属性: xib文件名 File’s Owner xib文件中的视图的Class xib文件中的视图的Outlet指向 File’s Owner 可以关联到某类,然后通过IBO ...
- 几种Aop实现及Castle.DynamicProxy的使用
AoP(Aspect Oriented Programming,面向切面编程) .Net平台AOP技术研究 简单实现 通过继承实现 public interface ICoding { void Do ...
- Entity Framework在WCF中序列化的问题
问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- Json-遍历
1.js遍历 var data=[{name:"a",age:12},{name:"b",age:11},{name:"c",age:13} ...
- 类-string/Manth/Random/DateTime-及练习
类一.string类:.Length 字符串的长度 .Trim() 去掉开头以及结尾的空格.TrimStart() 去掉开头的空格.TrimEnd() 去掉结尾的空格 .ToLower() 全部转换为 ...
- Leetcode 306. Additive Number
Additive number is a string whose digits can form additive sequence. A valid additive sequence shoul ...
- Leetcode 226. Invert Binary Tree
Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 class Solution(object): ...
- 【BZOJ-4173】数学 欧拉函数 + 关于余数的变换
4173: 数学 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 306 Solved: 163[Submit][Status][Discuss] D ...
- 如何利用SmartGit将一个已经写好的项目push到github
首先在github上创建一个repository, 然后在SmartGit中 点击有上角的repository然后选择Add or Create...然后点击那个文件夹的图标之后选中自己的项目的问题件 ...