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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM