mysql游标统计_集成MySQL的自定义函数,存储过程,游标应用,实现分词功能和统计功能....

使用MySQL中的函数,存储过程,游标,来实现,数据库里分词并且统计的功能。

先看功能效果:

00a894324df2a695febef0036f255fbf.png

有这么一个tempic表,其中有个字段  是keyword.这个字段的数据是用“,” 或者“,”隔开的. 现在我们实现的功能是将keyword中的数据,根据逗号“,”把她分开。并且统计相同分割后的词语的filedowntime的和.

举个例 :

id=1的数据,keyword是 宝宝,可爱,熊

id=6的数据,keyword是 可爱,宝宝,啊啊.

id=2的数据,keyword是 啊啊,宝宝,可爱.

则我们需要分别得到词语 "宝宝", "可爱",   "熊", "啊啊"  并且得到"宝宝"的filedowntime的次数是:12+232+233 .

而 "熊"的filedowntime的次数是:12    .

等等....

我们把分离后的词语以及统计的filedowntime的数据, 添加到另外一个表里去.

表的结构如右图:

aba1ce045d6637fd3457e77d78f975eb.png

接下来.看张图表现出具体效果.

3d53ca4cb0c4bd3c7201f05bfed5a86b.png

现在展现表,实际上是temptable1的数据内容.说明已经分词成功.

下面具体说明怎么实现该功能.

如果上图.我们用到了一个存储过程.两个方法.

分别是:sp_split_result,func_get_split_string,

func_get_split_string_total

下面贴出来SQL:

函数:  func_get_split_string

DELIMITER $$

DROP FUNCTION IF EXISTS `func_get_split_string`$$

CREATE FUNCTION `func_get_split_string`(f_string VARCHAR(50), f_delimiter VARCHAR(5), f_order INTEGER(11)) RETURNS varchar(50)

begin

declare result varchar(25) default '';

declare str_key varchar(25) default '';

set str_key = f_string ;

set result=reverse(substring_index(reverse(substring_index(str_key,f_delimiter,f_order)),f_delimiter,1));

return result;

end$$

DELIMITER ;

表达的效果即下图:

59d1a45f30e93a36baef751d14acacb8.png

如上图所示:我们传一个f_string参数: a, b , d, c  。 用 “,” 逗号 分割.  f_order 代表,取得第"二"个词语.

下面介绍:func_get_split_string_total 函数

SQL 代码:

DELIMITER $$

DROP FUNCTION IF EXISTS `func_get_split_string_total`$$

CREATE FUNCTION `func_get_split_string_total`(f_string VARCHAR(50), f_delimiter VARCHAR(5)) RETURNS int(11)

return 1+(length(f_string)-length(replace(f_string,f_delimiter,'')))$$

DELIMITER ;

她表达的功能如右图:

f2636d9fdb81c6dc5a8debf71ad9135f.png

即:我们传人参数f_string : a, b , c , d ,s   参数f_delimiter 即: "," 返回出结果是: 5,即说明用“,” 分割f_string可以得到5个词语.

重点介绍:存储过程.sp_split_result

SQL:

DELIMITER $$

DROP PROCEDURE IF EXISTS `sp_split_result`$$

CREATE PROCEDURE `sp_split_result`( IN f_delimiter VARCHAR(5))

BEGIN

declare cnt int default 0 ;

declare i int default 0 ;

declare f_string VARCHAR(50) default '';

declare down_sum int default 0;

declare temp_sum int default 0;

declare f_tempkey varchar(50) default '';

declare cur_1 CURSOR FOR select replace(keyword,',',',') 'keyword' ,sum(filedowntime) 'sum1' from temppic where keyword <> '' and keyword not like '%null%' group by keyword order by 'sum1' desc ;

DECLARE CONTINUE HANDLER FOR NOT FOUND set f_string=null;

open cur_1;

delete from temptable1;

fetch cur_1 into f_string , down_sum ;

while (f_string is not null) do

set cnt = func_get_split_string_total(f_string,f_delimiter);#获得字符串总数。

while i

set i=i+1;

set f_tempkey =func_get_split_string(f_string,f_delimiter,i);#获得分割后的单个词语

select count(1) into temp_sum from temptable1 where tempkey= f_tempkey;#判断关键词语时候已经在temptable1表中出现啦.

if temp_sum=0 then

insert into temptable1(tempkey,downcount) values (f_tempkey,down_sum);

else if temp_sum<>0 then

update temptable1 set downcount= downcount+down_sum where tempkey=f_tempkey;

end if;

end if;

end while;

fetch cur_1 into f_string ,down_sum;

set i=0; #记得一个循环之后,将i 清零. 循环是指形如 "a,b,c" .这样的一个词语,产生了3次循环.

end while;

close cur_1;

select tempkey, downcount from temptable1 order by downcount desc ;

END$$

DELIMITER ;

select replace(keyword,',',',') 'keyword' ,sum(filedowntime) 'sum1' from temppic where keyword <> '' and keyword not like '%null%' group by keyword order by 'sum1' desc ;

这句代码为目标查询结果,我们将keyword中的","全部替换成了 "," 。为了下面的程序更好的调用.

好了就这样啦..over ..也是自己摸索出来的。贴出来.希望以后在其中会有新的突破.

1

0

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2009-07-31 23:48

浏览 2617

分类:数据库

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值