请问,mysql中,在一个表中根据表中某一字段分组,然后获取每组最新的mysql分组每组5条数据据,该怎么写;

mysql分组取每组前几条记录(排名) 附group by与order by的研究
http://www.jb51.net/article/31590.htm
--按某一字段分组取最大(小)值所在行的数据
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 5 b5b5b5b5b5
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a', 2, 'a2(a的第二个值)')
insert into tb values('a', 1, 'a1--a的第一个值')
insert into tb values('a', 3, 'a3:a的第三个值')
insert into tb values('b', 1, 'b1--b的第一个值')
insert into tb values('b', 3, 'b3:b的第三个值')
insert into tb values('b', 2, 'b2b2b2b2')
insert into tb values('b', 4, 'b4b4')
insert into tb values('b', 5, 'b5b5b5b5b5')
--一、按name分组取val最大的值所在行的数据。
--方法1: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 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 3 a3:a的第三个值
b 5 b5b5b5b5b5
本人推荐使用1,3,4,结果显示1,3,4效率相同,2,5效率差些,不过我3,4效率相同毫无疑问,1就不一样了,想不搞了。
--二、按name分组取val最小的值所在行的数据。
&代码如下:
--方法1: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--a的第一个值
b 1 b1--b的第一个值
--三、按name分组取第一次出现的行所在的数据。
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
--四、按name分组随机取一条数据。
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--a的第一个值
b 5 b5b5b5b5b5
--五、按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.valselect 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的第一个值
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
b 2 b2b2b2b2
--六、按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 2 a2(a的第二个值)
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
--七,假如整行数据有重复,所有的列都相同(例如下表中的第5,6两行数据完全相同)。 按name分组取最大的两个(N个)val
&代码如下:
数据如下:
name val memo
a 2 a2(a的第二个值)
a 1 a1--a的第一个值
a 1 a1--a的第一个值
a 3 a3:a的第三个值
a 3 a3:a的第三个值
b 1 b1--b的第一个值
b 3 b3:b的第三个值
b 2 b2b2b2b2
b 5 b5b5b5b5b5
阅读(...) 评论()2014年11月 PHP大版内专家分月排行榜第三2014年6月 PHP大版内专家分月排行榜第三2014年4月 PHP大版内专家分月排行榜第三2014年2月 PHP大版内专家分月排行榜第三2013年11月 PHP大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。sql统计表中某个字段不同值的总数,但按另一个字段分组,求大神_mysql吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:36,345贴子:
sql统计表中某个字段不同值的总数,但按另一个字段分组,求大神收藏
如表table中有两个字段,status和name,status有1,2,3这几个值,name
3现在要根据name分组统计所有stat = 1 和不等于1的个数.按上面数据应该是赵 2 1王 1 1这样的sql怎么写,一条sql
魅族PRO 6s手机直降200元!给你多买一双新鞋、一条新耳机的理由!
count group by
应用吧活动,
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或mysql 先按某字段分组再取每组中前N条记录 - 博客频道 - CSDN.NET
架构设计,项目管理,IT技术专栏, web开发工程师的工作手记
分类:数据库
create&table&t2&(
&&&&id&int&primary&key,
&&&&gid&&&&char,
&&&&col1&&&&int,
&&&&col2&&&&int
insert&into&t2&values&
(1,'A',31,6),
(2,'B',25,83),
(3,'C',76,21),
(4,'D',63,56),
(5,'E',3,17),
(6,'A',29,97),
(7,'B',88,63),
(8,'C',16,22),
(9,'D',25,43),
(10,'E',45,28),
(11,'A',2,78),
(12,'B',30,79),
(13,'C',96,73),
(14,'D',37,40),
(15,'E',14,86),
(16,'A',32,67),
(17,'B',84,38),
(18,'C',27,9),
(19,'D',31,21),
(20,'E',80,63),
(21,'A',89,9),
(22,'B',15,22),
(23,'C',46,84),
(24,'D',54,79),
(25,'E',85,64),
(26,'A',87,13),
(27,'B',40,45),
(28,'C',34,90),
(29,'D',63,8),
(30,'E',66,40),
(31,'A',83,49),
(32,'B',4,90),
(33,'C',81,7),
(34,'D',11,12),
(35,'E',85,10),
(36,'A',39,75),
(37,'B',22,39),
(38,'C',76,67),
(39,'D',20,11),
(40,'E',81,36);
1)&N=1&取GID每组&COL2最大的记录
&&&&+----+------+------+------+
&&&&|&id&|&gid&&|&col1&|&col2&|
&&&&+----+------+------+------+
&&&&|&&6&|&A&&&&|&&&29&|&&&97&|
&&&&|&15&|&E&&&&|&&&14&|&&&86&|
&&&&|&24&|&D&&&&|&&&54&|&&&79&|
&&&&|&28&|&C&&&&|&&&34&|&&&90&|
&&&&|&32&|&B&&&&|&&&&4&|&&&90&|
&&&&+----+------+------+------+
2)&N=3&取GID每组&COL2最大的3条记录
&&&&+----+------+------+------+
&&&&|&id&|&gid&&|&col1&|&col2&|
&&&&+----+------+------+------+
&&&&|&&6&|&A&&&&|&&&29&|&&&97&|
&&&&|&11&|&A&&&&|&&&&2&|&&&78&|
&&&&|&36&|&A&&&&|&&&39&|&&&75&|
&&&&|&32&|&B&&&&|&&&&4&|&&&90&|
&&&&|&&2&|&B&&&&|&&&25&|&&&83&|
&&&&|&12&|&B&&&&|&&&30&|&&&79&|
&&&&|&28&|&C&&&&|&&&34&|&&&90&|
&&&&|&23&|&C&&&&|&&&46&|&&&84&|
&&&&|&13&|&C&&&&|&&&96&|&&&73&|
&&&&|&24&|&D&&&&|&&&54&|&&&79&|
&&&&|&&4&|&D&&&&|&&&63&|&&&56&|
&&&&|&&9&|&D&&&&|&&&25&|&&&43&|
&&&&|&15&|&E&&&&|&&&14&|&&&86&|
&&&&|&25&|&E&&&&|&&&85&|&&&64&|
&&&&|&20&|&E&&&&|&&&80&|&&&63&|
&&&&+----+------+------+------+
SELECT&a.id,a.gid,a.col1,a.col2&FROM&t2 a
LEFT&JOIN&t2 b
ON&a.gid=b.gid&AND&a.col2&=b.col2
GROUP&BY&a.id,a.gid,a.col1,a.col2
HAVING&COUNT(b.id)&=3
ORDER&BY&a.gid,a.col2&desc
SELECT&a.id,a.gid,a.col1,a.col2&FROM&t2 a
WHERE&3&=(
SELECT&COUNT(*)&FROM&t2 b
WHERE&a.gid=b.gid&AND&a.col2&=b.col2)
ORDER&BY&a.gid,a.col2&desc
排名:第623名
(13)(43)(163)(40)(23)(28)(72)(25)(46)(21)(54)(31)(145)(142)(11)(9)(8)(1)(9)(3)
(102090)

我要回帖

更多关于 mysql 按两个字段分组 的文章

 

随机推荐