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

原创 2016年05月31日 15:52:08

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

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抽取每组分类的记录个数。


运行结果如下所示:


BigInteger类实例的构造过程——JDK源码解析

最近看了下JDK1.6版本的BigInteger类,仔细研究了下大整数实例的构造过程,现在把自己的所得所想分享给大家. 首先,为什么需要大整数类?简单的说就是因为内部的数据类型能表示的最大数是64位长...

java中的BigInteger(很好很强大)(转)

JAVA之BigInteger 用Java来处理高精度问题,相信对很多ACMer来说都是一件很happy的事,简单易懂。用Java刷了一些题,感觉Java还不错,在处...
  • w00w12l
  • w00w12l
  • 2012年02月24日 14:42
  • 97764

Lucene中分组统计(GroupBy)及去重(Distinct)性能在数量级上提升解决方案 --- Lucene高性能

转:http://www.cnblogs.com/zengen/archive/2011/04/19/2020681.html 在2010年的时候,写过两篇关于LUCENE高性能GROUP ...

MySQL分组排序取前N条记录以及生成自动数字序列--group by 后 limit 外加 rownumber

同事提了一个需求,要求按照某列分组,然后将各组的前几条抽取出来。 表结构 CREATE TABLE `total_freq_ctrl` ( `time` int(10) unsigned NOT ...
  • ylqmf
  • ylqmf
  • 2014年09月02日 14:46
  • 28456

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

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

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

前言:         同事的业务场景是,按照cid、author分组,再按照id倒叙,取出前2条记录出来。         oracle里面可以通过row_number() OVER (...

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

前言:         同事的业务场景是,按照cid、author分组,再按照id倒叙,取出前2条记录出来。         oracle里面可以通过row_number() OVER (...
  • jumewo
  • jumewo
  • 2015年07月08日 11:05
  • 582

关于城市列表按首字母排序、分组及查找的一个解决方案(mysql端)java

最近要做一个城市列表,网上找了个
  • hjy628
  • hjy628
  • 2014年10月20日 17:09
  • 3535

Oracle分组查询取每组排序后的前N条记录

项目中用到Oracle分组查询取每组排序后的前N条记录,group by 只能返回每个组的单条统计。所以用OVER(PARTITION BY)函数,具体详见baidu.com 建个测试表test_ab...

[mysql] 先按某字段分组再取每组中前N条记录

From: http://blog.chinaunix.net/uid-26729093-id-4294287.html 请参考:http://bbs.csdn.net/topics/3300212...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mysql分组统计、排序、取前N条记录解决方案
举报原因:
原因补充:

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