设为首页 收藏本站
查看: 761|回复: 0

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

[复制链接]

尚未签到

发表于 2016-10-25 07:36:56 | 显示全部楼层 |阅读模式
  使用MySQL中的函数,存储过程,游标,来实现,数据库里分词并且统计的功能。
  
  先看功能效果:
DSC0000.jpg

  
  有这么一个tempic表,其中有个字段  是keyword.这个字段的数据是用“,” 或者“,”隔开的. 现在我们实现的功能是将keyword中的数据,根据逗号“,”把她分开。并且统计相同分割后的词语的filedowntime的和.
  
  举个例 :
  id=1的数据,keyword是 宝宝,可爱,熊
  id=6的数据,keyword是 可爱,宝宝,啊啊.
  id=2的数据,keyword是 啊啊,宝宝,可爱.
  则我们需要分别得到词语 "宝宝", "可爱",   "熊", "啊啊"  并且得到"宝宝"的filedowntime的次数是:12+232+233 .
  而 "熊"的filedowntime的次数是:12    .
  等等....
  
  我们把分离后的词语以及统计的filedowntime的数据, 添加到另外一个表里去.
  
  表的结构如右图:
DSC0001.jpg

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

  
  
  
  
  现在展现表,实际上是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 ;
  表达的效果即下图:
DSC0003.jpg

  
  如上图所示:我们传一个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 ;
  
  她表达的功能如右图:
DSC0004.jpg

  
  即:我们传人参数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<cnt  do
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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-290787-1-1.html 上篇帖子: 使用mysqlhotcopy命令行工具创建备份 下篇帖子: 正确设定mysql的字符集编码的探索---需要向数据库中插入中文数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表