mysql分组查询选择数量最多的前十个_mysql中查询每个分组的前几名或者分组取最大N条记录的方法探讨...

在使用SQL的过程中,我们经常遇到这样一类问题:如何找出每个程序最近的日志条目?如何找出每个用户的最高分?在每个分类中最受欢迎的商品是什么?通常这类“找出每个分组中最高分的条目”的问题可以使用相同的技术来解决

我们以如下例子来测试:

create table t2 (

id int primary key,

gid    char,

col1    int,

col2    int

) engine=myisam;

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 union all:

(select * from t2 where type = 'A' order by col2 limit 3)

union all

(select * from t2 where type = 'B' order by col2 limit 3)

union all

(select * from t2 where type = 'C' order by col2 limit 3)

union all

(select * from t2 where type = 'D' order by col2 limit 3)

方法2:

set @x = 0;

set @g = 'A';

SELECT * FROM (SELECT @x:=IF(@g = t2.gid, @x+1, IF(@g:=t2.gid, @x, 1)) AS s, t2.* FROM t2 ORDER BY gid ASC, col2 DESC) AS t WHERE s <= 3;

方法3:

SELECT

a.*

FROM

t2 a,t2 b

WHERE

a.gid = b.gid AND a.col2 < b.col2

GROUP BY

a.id, a.gid, a.col1, a.col2

HAVING  COUNT(a.id) <= 3 ORDER BY   a.gid, a.col2 DESC

方法4和3类似:

SELECT a.id,a.gid,a.col1,a.col2 FROM t2v a

LEFT JOIN t2v 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 t2v a

WHERE 3>=(

SELECT COUNT(*) FROM t2v b

WHERE a.gid=b.gid AND a.col2<=b.col2)

ORDER BY a.gid,a.col2 desc

SELECT a.id,a.gid,a.col1,a.col2

FROM t2  a,t2 b

where 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

方法基本上都是类似,但是在大数据的时候效率就凸显出来了。

个人建议,可以采用队列的方式。

gid 每次增加的时候,向队列里面插入数据,同时删除老的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值