zoukankan      html  css  js  c++  java
  • 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='文章与关键词关系表'


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

     

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


    运行结果如下所示:


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

  • 相关阅读:
    【题解】【HDU 3487】Play with Chain
    学习+复习目标
    【题解】【NOIP2018PJ】对称二叉树
    NOIP2018复赛游记
    论蒟蒻的作死程度
    教你如何不用新分区添加swap
    云主机的极致优化
    Linux权限管理 特殊权限解析
    用户组管理
    vim编辑器详解
  • 原文地址:https://www.cnblogs.com/Formulate0303/p/11962691.html
Copyright © 2011-2022 走看看