mysql 分组统计前一条_mysql 分组统计、排序、取前N条记录解决方案

需要在mysql中解决记录的分组统计、排序,并抽取前10条记录的功能。现已解决,解决方案如下:

1)表结构

CREATE TABLE `policy_keywords_rel` (

`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',

`content_id` int(11) NOT NULL COMMENT '文章id',

`keyword_id` int(11) NOT NULL COMMENT '关键词id',

`cnt` int(11) NOT NULL COMMENT '关键词频次',

`n` varchar(10) DEFAULT NULL,

`keyword` varchar(90) DEFAULT NULL COMMENT '关键词名称',

PRIMARY KEY (`content_id`,`keyword_id`),

KEY `id` (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='文章与关键词关系表'

原始表部分数据截图如下所示:

f8fce9ea454fed12cd79128453e7364f.png

2)实现功能

根据字段‘n’(关键词类别)和‘keyword_id’(关键词id)进行分组统计每个类别下相同关键词的总频次('cnt'为关键词的频次),然后根据关键词总频次进行降序排序,最后抽取每个分组下总频次排名前10的关键词。

3)解决方案

SET @row=0; SET @mid= '';

SELECT T2.* FROM (SELECT T.*,case WHEN @mid=n THEN @row:=@row+1 ELSE @row:=1 END rownum,@mid:=n mid FROM (SELECT keyword_id,keyword,sum(cnt),n FROM policy_keywords_rel

GROUP BY keyword_id, n ORDER BY n,sum(cnt) DESC) AS T ) AS T2

WHERE T2.rownum<=10

解决思路:变量@row用来做rownum,变量@mid用来分组。最里层的sql语句通过group by与order by语句获取分组统计好的数据集,即根据关键词类别及关键词进行分组、统计所有文章相同在每个类别下相同关键词的总频次;中间层的sql语句获取每组分类的rownum,当mid的值与分组字段n的值相同是rownum自增,若不相同则从1开始计数;最外层的sql语句根据rownum抽取每组分类的记录个数。

运行结果如下所示:

6d8c7ea996fb926bd82fe505db7d0469.png

原文链接:https://blog.csdn.net/amino77/article/details/51546050

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值