使用MySQL中的函数,存储过程,游标,来实现,数据库里分词并且统计的功能。
先看功能效果:
有这么一个tempic表,其中有个字段 是keyword.这个字段的数据是用“,” 或者“,”隔开的. 现在我们实现的功能是将keyword中的数据,根据逗号“,”把她分开。并且统计相同分割后的词语的filedowntime的和.
举个例 :
id=1的数据,keyword是 宝宝,可爱,熊
id=6的数据,keyword是 可爱,宝宝,啊啊.
id=2的数据,keyword是 啊啊,宝宝,可爱.
则我们需要分别得到词语 "宝宝", "可爱", "熊", "啊啊" 并且得到"宝宝"的filedowntime的次数是:12+232+233 .
而 "熊"的filedowntime的次数是:12 .
等等....
我们把分离后的词语以及统计的filedowntime的数据, 添加到另外一个表里去.
表的结构如右图:
接下来.看张图表现出具体效果.
现在展现表,实际上是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 ;
表达的效果即下图:
如上图所示:我们传一个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 ;
她表达的功能如右图:
即:我们传人参数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 ..也是自己摸索出来的。贴出来.希望以后在其中会有新的突破.
分享到:
相关推荐
mysql函数、存储过程、触发器、游标
Mysql存储过程游标触发器
Oracle存储过程、游标、函数的详解
MySQL实验报告5(存储过程与函数)(1)(1).pdf
Oracle存储过程游标详解,针对Oracle存储过程游标详细说明。
oracle 的函数、存储过程、游标、简单实例 oracle常用语句oracle 的函数、存储过程、游标、简单实例 oracle常用语句
学习 游标 视图 自定义函数不二选择,我觉得看完之后学到东西了
sql 存储过程常用函数及游标用法 这里包括 字符函数,数据库维护命令,所有游标的用法以及日期函数
游标 存储过程游标 存储过程
Mysql游标(循环操作)
SqlServer存储过程游标 ,一个例子
利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc 利用游标返回结果集的的例子(Oracle 存储过程).doc
存储过程和游标.doc
26.MySQL高级存储过程语法游标基本操作.avi 27.MySQL高级存储过程语法循环获取游标.avi 28.MySQL高级存储过程函数.avi 29.MySQL高级触发器介绍.avi 30.MySQL高级触发器创建及应用.avi └31.MySQL高级触发器查看及...
SQL Server 2005数据库视图、游标和自定义函数
PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 游标的使用.PB中 ...
TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储过程 游标 数据库 sql优化 存储过程分页 TSQL 存储...
带游标的mysql存储过程例子。
Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标Oracle_的存储过程及游标
oracle的存储过程与游标的使用。不错的资源。oracle为10g