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


运行结果如下所示:


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

分组取前N记录

经常看到问题,如何取出每组的前N条记录。方便大家参考于是便把常见的几种解法列出于下。 问题:有表 如下,要求取出各班前两名(允许并列第二) Table1 +----+------+-----...

Mysql 利用group by 分组排序

MySql的group by与oracle有所不同,查询得字段可以不用写聚合函数,查询结果取得是每一组的第一行记录。 利用上面的特点,可以利用mysql实现一种独特的排序; 首先先按某个字段进行ord...

mysql分组取每组前几条记录(排序)

[sql] view plaincopy CREATE TABLE `mygoods` (     `goods_id` int(11) unsigned NOT ...

MySQL分组排序取前N条记录 以及 生成自动数字序列 的SQL

-- MySQL分组排序取前N条记录的最简洁的单条sql。USE test;DROP TABLE IF EXISTS test;CREATE TABLE test (  id INT PRIMARY ...
  • mchdba
  • mchdba
  • 2014-03-26 11:42
  • 6264

mysql 显示行号,以及分组排序

mysql 显示行号,以及分组排序 建表: CREATE TABLE `my_tb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent...
  • isoleo
  • isoleo
  • 2016-03-07 11:18
  • 8540

关于MySql 对GroupBy进行排序的解决方案

很简单。。 SELECT * FROM (SELECT * FROM posts ORDERBY dateline DESC) GROUP BY  tid ORDER BY dateline...

mysql分组,取每组前几条记录

SELECT  * FROM 表名 a WHERE (SELECT count(*) FROM 表名 b WHERE b.日期=a.日期 AND b.id>a.id  )<5  ORDER BY 日期...

mysql 分组排序显示序列号 row_number()

mysql 分组排序显示序列号 mysql没有row_number()函数,如何实现分组排序显示序列号 需求:要求分组统计后得出排名。如图1,根据组织分组后按绩效得分排名得图2效果。表名:pef_...

mysql 先排序后分组再排序查询数据

SELECT * FROM (SELECT * FROM table ORDER BY test DESC) AS a GROUP BY a.test1 ORDER BY a.test DESC;

贪心算法-均分纸牌-JAVA

[均分纸牌]有N堆纸牌,编号分别为1,2,…,n。每堆上有若干张,但纸牌总数必为n的倍数.可以在任一堆上取若干张纸牌,然后移动。移牌的规则为:在编号为1上取的纸牌,只能移到编号为2的堆上;在编号为n的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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