需要在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
