Mysql分组统计、排序、取前N条记录解决方案
2016-05-31 15:52
633 查看
今日根据项目需求,需要在mysql中解决记录的分组统计、排序,并抽取前10条记录的功能。现已解决,解决方案如下:
1)表结构
原始表部分数据截图如下所示:
2)实现功能
根据字段‘n’(关键词类别)和‘keyword_id’(关键词id)进行分组统计每个类别下相同关键词的总频次('cnt'为关键词的频次),然后根据关键词总频次进行降序排序,最后抽取每个分组下总频次排名前10的关键词。
3)解决方案
解决思路:变量@row用来做rownum,变量@mid用来分组。最里层的sql语句通过group by与order by语句获取分组统计好的数据集,即根据关键词类别及关键词进行分组、统计所有文章相同在每个类别下相同关键词的总频次;中间层的sql语句获取每组分类的rownum,当mid的值与分组字段n的值相同是rownum自增,若不相同则从1开始计数;最外层的sql语句根据rownum抽取每组分类的记录个数。
运行结果如下所示:
1)表结构
<span style="font-size:18px;">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='文章与关键词关系表'</span>
原始表部分数据截图如下所示:
2)实现功能
根据字段‘n’(关键词类别)和‘keyword_id’(关键词id)进行分组统计每个类别下相同关键词的总频次('cnt'为关键词的频次),然后根据关键词总频次进行降序排序,最后抽取每个分组下总频次排名前10的关键词。
3)解决方案
<span style="font-size:18px;">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</span>
解决思路:变量@row用来做rownum,变量@mid用来分组。最里层的sql语句通过group by与order by语句获取分组统计好的数据集,即根据关键词类别及关键词进行分组、统计所有文章相同在每个类别下相同关键词的总频次;中间层的sql语句获取每组分类的rownum,当mid的值与分组字段n的值相同是rownum自增,若不相同则从1开始计数;最外层的sql语句根据rownum抽取每组分类的记录个数。
运行结果如下所示:
相关文章推荐
- Mysql分组统计、排序、取前N条记录解决方案
- Mysql分组统计、排序、取前N条记录解决方案
- MySQL学习第六天 学习MySQL基本数据类型
- MySQL中char与varchar数据类型选择原则
- mysql常用配置---详细解释
- MySQL学习第五天 MySQL数据库基本操作
- Mysql一主多从和读写分离配置简记
- MySQL 5.5 installation
- MYSQL查询表达方式
- 使用mysqlsla分析mysql日志
- 剖析mysql查询
- MySQL数据库配置主从服务器实现双机热备
- 修改MySql的存储过程、函数、事件、触发器、视图的 DEFINER
- MYSQL使用group by,如何查询出总记录数
- MySQL数据备份之mysqldump
- mysql 常用SQL语句
- #MYSQL表的增删
- MYSQL双主故障解决实例。
- MYSQL
- MySQL存储过程事务处理