在mysql中没有提供分组统计函数,但mysql中变量使用非常灵活,在sql中可以灵活使用变量,这给mysql实现分组的方式带来很大方便,因此在
mysql实现一个分组统计的功能也并不难以实现,且理解起来还比较容易,比如我们提供一下的数据,用来描述,查询出的关键词的词频数,然后根据关键词的
类型,分组统计组内词频出现次数最后的前三挑数据
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
INSERT INTO dwsurvey.policy_keywords_rel (id,content_id,keyword_id,cnt,n,keyword)
VALUES (3,1,68860,3,'te','知识产权');
INSERT INTO dwsurvey.policy_keywords_rel (id,content_id,keyword_id,cnt,n,keyword)
VALUES (13,1,49258,5,'n','科技创新');
INSERT INTO dwsurvey.policy_keywords_rel (id,content_id,keyword_id,cnt,n,keyword)
VALUES (1,1,44177,19,'te','技术');
INSERT INTO dwsurvey.policy_keywords_rel (id,content_id,keyword_id,cnt,n,keyword)
VALUES (4,1,42982,3,'te','行业标准');
INSERT INTO dwsurvey.policy_keywords_rel (id,content_id,keyword_id,cnt,n,keyword)
VALUES (10,1,7405,6,'n','市政府');
select * from policy_keywords_rel
从如下sql中可以查询出,组内词频数据排名,且相同词频的数据排名相同
SELECT
T2.*
FROM
(
SELECT
T.*
,CASE
WHEN @MID = N and @TEMP_SCNT != SCNT THEN @ROW := @ROW + 1
WHEN @MID = N and @TEMP_SCNT = SCNT THEN @ROW := @ROW
ELSE @ROW := 1
END ROWNUM
,@MID := N MID
,@TEMP_SCNT := SCNT
FROM
(
SELECT
KEYWORD_ID,
KEYWORD,
SUM( CNT ) as SCNT,
N
FROM
POLICY_KEYWORDS_REL
GROUP BY
KEYWORD_ID,
N
ORDER BY
N,
SUM( CNT ) DESC
) AS T
) AS T2
WHERE
T2.ROWNUM <= 3