mysql分组查询取前几条

原创 2015年11月20日 23:09:30

最近对mysql分组查询取前几条这个问题做个总结
1:建表,搞点测试数据
CREATE TABLE IF NOT EXISTS test (
id tinyint unsigned NOT NULL AUTO_INCREMENT,
type char(1) NOT NULL,
data char(4) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
INSERT INTO test (id, type, data) VALUES
(1, ‘1’, ‘1qaz’),
(2, ‘1’, ‘2wsx’),
(3, ‘1’, ‘3edc’),
(4, ‘2’, ‘4rfv’),
(5, ‘3’, ‘5tgb’),
(6, ‘3’, ‘6yhn’),
(7, ‘4’, ‘1ujm’),
(8, ‘4’, ‘2mju’),
(9, ‘4’, ‘3nhy’),
(10, ‘4’, ‘4bgt’);
现在取type相同的前两条数据即:
(3, ‘1’, ‘3edc’),
(2, ‘1’, ‘2wsx’),
(4, ‘2’, ‘4rfv’),
(6, ‘3’, ‘6yhn’),
(5, ‘3’, ‘5tgb’),
(10, ‘4’, ‘4bgt’);
(9, ‘4’, ‘3nhy’),
开始测试:
第一种方法:
select a.type,a.data,b.data,count(a.data) from test a left join test b
on a.type=b.type and a.data<=b.data
group by a.type,a.data
– having count(a.data)<=2
这里写图片描述
这里为什么要将count(a.data)和a.data<=b.data这个标为黑色,看图,很完美的使用了聚合函数与分组与having 筛选。
之后只需要将count(a.data)为3的排除即可如图:
这里写图片描述
之后再加工下就可以了。
select a1.* from test a1
inner join
(select a.type,a.data from test a left join test b
on a.type=b.type and a.data<=b.data
group by a.type,a.data
having count(a.data)<=2
)b1
on a1.type=b1.type and a1.data=b1.data
order by a1.type,a1.data desc
这里写图片描述

第二种方法:
利用row_number或者说是制造一个row number
set @num := 0, @type := ”;
SELECT id, type, data,
case when @type = type
then @num:=@num+1
else @num:=1
end rownum,
@type:=type other_type
FROM test
order by type, data desc
这里写图片描述
黑色为重点。
这里可以看到和先前一样只要处理rownum为3的即可
set @num := 0, @type := ”;
select b.rownum,a.*
from test a
inner join
(SELECT type, data,
case when @type = type
then @num:=@num+1
else @num:=1
end rownum,
@type:=type other_type
FROM test
order by type, data desc
) b on b.type=a.type
and b.data=a.data where b.rownum<=2;
这里写图片描述

第三种方法:
是在一个国外的网站看到的,很好的解决方式,没有表间的连接查询,只有一张表。也是利用row number
set @num := 0, @type := ”;
select id, type, data,
@num := if(@type=type, @num + 1, 1) as row_number,
@type := type as other_type
from test c
order by type, data desc
这里写图片描述
好了也是和上面一样将rownumber为3的解决掉
set @num := 0, @type := ”;
select *
from (
select id,type, data,
@num := if(@type=type, @num + 1, 1) as row_number,
@type := type as other_type
from test c
order by type, data desc
) a
group by type, data
having row_number <= 2
– order by type, data desc;
这里写图片描述
是不是觉得结果不对,将order by type, data desc;去掉注释即可。哈哈
希望对你有帮助。

版权声明:本文为博主原创文章,未经博主允许不得转载。

mysql分组取每组前几条记录(排序)

[sql] view plaincopy CREATE TABLE `mygoods` (     `goods_id` int(11) unsigned NOT NULL AUTO_...
  • come_on_air
  • come_on_air
  • 2017年06月07日 18:02
  • 2390

MySql中取出每个分组中的前N条记录

需求是这样的(CSDN上的一个问题):mysql中有个表:article(字段:id,type,date),type有1-10,10种类型。现在要用SQL找出每种类型中时间最新的前N个数据组成的集合。...
  • hudie1234567
  • hudie1234567
  • 2011年03月18日 10:59
  • 12008

mysql分组取每组前几条记录(排名) 附group by与order by的研究

本文转自:http://www.cnblogs.com/mo-beifeng/archive/2012/02/07/2341886.html --按某一字段分组取最大(小)值所在行的数据 /*...
  • a19860903
  • a19860903
  • 2016年04月13日 15:03
  • 5213

mysql分组,取每组前几条记录

SELECT  * FROM 表名 a WHERE (SELECT count(*) FROM 表名 b WHERE b.日期=a.日期 AND b.id>a.id  )...
  • github_26672553
  • github_26672553
  • 2016年03月04日 10:51
  • 6979

[MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit

前言:        同事的业务场景是,按照cid、author分组,再按照id倒叙,取出前2条记录出来。        oracle里面可以通过row_number() OVER (PARTITIO...
  • mchdba
  • mchdba
  • 2014年09月10日 22:50
  • 10776

MySQL对数据表进行分组查询(GROUP BY)

MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组。字段中值相等的为一组。基本的语法格式如下: GROUP BY 属性名 [...
  • q1054261752
  • q1054261752
  • 2015年09月01日 11:53
  • 27192

MySQL无限分类的数据表设计以及各种查询

先创建一个表 CREATE TABLE tdb_goods_types(      type_id   SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, ...
  • sunnyxuebuhui
  • sunnyxuebuhui
  • 2016年12月09日 14:41
  • 1822

21、MySQL-分组查询(GROUP BY)及二次筛选(HAVING)

为了测试GROUP BY 语句,我们创建两张表,并往表中添加数据 -- 创建部门表 CREATE TABLE IF NOT EXISTS department( id TINYINT UNSIG...
  • li460998973
  • li460998973
  • 2015年03月06日 15:05
  • 15931

分组查询取每组前n条记录实例

假设有这样一张运动员比赛成绩表 tb_score 现在要求查询出每个国家的前三名的成绩记录,查询语句可以这样写: 1、 select t3.id,t3.country,t3.score ...
  • zhutulang
  • zhutulang
  • 2015年09月23日 15:17
  • 3272

mysql获取所有分类的前n条记录的两种方法浅析

当日看点 2016-12-31 17:21 项目中有个需求是获取出展会分类下的前n条展商。 刚开始的思路是用group by 获取出展会的分类,后面再根据分类获取该分类下的n个展商,但也需要第...
  • u011277123
  • u011277123
  • 2017年01月11日 17:29
  • 1906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql分组查询取前几条
举报原因:
原因补充:

(最多只允许输入30个字)