现有一张表spam_keyword,共629条记录,每条记录的word字段的字符数量不等。

 CREATE TABLE `spam_keyword` (
`kid` int(11) NOT NULL,
`word` varchar(255) DEFAULT NULL,
`styles` varchar(50) DEFAULT NULL,
`cids` varchar(100) DEFAULT NULL,
`is_active` smallint(6) DEFAULT NULL,
`tm_add` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,-- 不为空,创建新纪录时设为当前时间
PRIMARY KEY (`kid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

要写一个procedure的目的是:根据spam_keyword表中的kid对word列逐行逐字分割到t表中,并且统计每个字的数量。

过程中用了两层循环,外循环游标读行,内循环stroo++读字。

 drop procedure if exists proc134f;
create procedure proc134f()
begin
declare kidoo int;
declare tid int;
declare stroo int;
declare str varchar(255);
declare strlength int;
declare istr varchar(3);
declare istr_cnt int;
declare done int;  -- 游标用
declare cur_kid cursor for select kid from spam_keyword;  -- 游标用
declare continue handler for not found set done=1; -- 游标用,据说是直达引擎的通道
set tid=0;
delete from t;
open cur_kid;  -- 开启游标
loop1:loop  -- 开启1层外循环
fetch cur_kid into kidoo;  -- 从定义的范围中读取下一行并赋予
if done=1 then leave loop1;end if;  -- 判断是否 found 下一行,否则跳出
select word into str from spam_keyword where kid=kidoo;
set str=replace(str,' ','');  -- 去掉空格
set strlength=char_length(str);
set stroo=0;
loop2:loop  -- 2层内循环
set stroo=stroo+1;
set istr=substr(str,stroo,1);
select count(*) into istr_cnt from t where t=istr;  -- 计数
if istr_cnt<>0 then update t set cnt=cnt+1 where t=istr;else
set tid=tid+1;
insert into t set id=tid,t=istr,cnt=1;end if;
if stroo>=strlength then leave loop2;end if;end loop loop2; set done=0;
end loop loop1;
close cur_kid;  -- 关闭游标
select * from t order by cnt desc;
END;

完成后,call proc134f 就可以查看在t表中的结果

 +-----+----+-----+
| id | t | cnt |
+-----+----+-----+
| 31 | 院 | 42 |
| 236 | 医 | 40 |
| 2 | 小 | 37 |
| 156 | 0 | 27 |
| 51 | 中 | 26 |
| 202 | 州 | 26 |
| 107 | 发 | 24 |
| 150 | 1 | 24 |
| 6 | 服 | 22 |
| 154 | 5 | 21 |
.
..
...省略1000行左右
| 1015 | 苑 | 1 |
| 1016 | 泽 | 1 |
| 1017 | 被 | 1 |
| 1018 | 驻 | 1 |
| 1019 | 鲁 | 1 |
| 1020 | 木 | 1 |
| 1021 | 齐 | 1 |
| 1022 | 雅 | 1 |
| 1023 | 友 | 1 |
+------+----+-----+

最终结果共1023行,即在spam_keyword表中共出现1023个不重复的字符,包含中文,英文,标点数字。出现次数最多的是“医“,”院”。

MySQL-procedure(cursor,loop)的更多相关文章

  1. MYSQL procedure

    没怎么接触过mysql procedure,今天建个calendar表还磨磨唧唧的,记录一下: CREATE PROCEDURE `new_procedure` (start_date DATA,en ...

  2. MySQL Procedure(MySQL存储过程)[转]

    ------Creating Stored Procedures in MySQL------ --Make sure you have version 5 of MySQL:   SELECT VE ...

  3. MySQL 中while loop repeat 的基本用法

    -- MySQL中的三中循环 while . loop .repeat 求 1-n 的和 -- 第一种 while 循环 -- 求 1-n 的和 /* while循环语法: while 条件 DO 循 ...

  4. MySQL中 while loop repeat 的用法

    -- MySQL中的三中循环 while . loop .repeat 求 1-n 的和 -- 第一种 while 循环 -- 求 1-n 的和 /* while循环语法: while 条件 DO 循 ...

  5. MySql存储过程 CURSOR循环

    游标 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力. 使用步骤 声明一个游标: declare 游标名称 CU ...

  6. mysql 游标CURSOR

    FETCH cursor_works INTO num,provinceIDs,cityIDs,SourceID; 定义的变量值必须与 游标中的字段不同,一一对应 DECLARE cursor_wor ...

  7. MySQL游标(cursor) 定义及使用

    概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果 ...

  8. 初习mysql procedure

    1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...

  9. mysql游标cursor与for循环

    delimiter // create procedure p2() begin declare row_id int DEFAULT 0; declare row_num int DEFAULT 0 ...

随机推荐

  1. 第 17 章 CSS 边框与背景[上]

    学习要点: 1.声明边框 2.边框样式 3.圆角边框 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 边框和背景,通过边框和背景的样式设置,给元素增加更丰富的外观. 一.声明边框 边框的声明有 ...

  2. Scalaz(11)- Monad:你存在的意义

    前面提到了scalaz是个函数式编程(FP)工具库.它提供了许多新的数据类型.拓展的标准类型及完整的一套typeclass来支持scala语言的函数式编程模式.我们知道:对于任何类型,我们只需要实现这 ...

  3. Python Sqlite3以字典形式返回查询结果

    sqlite3本身并没有像pymysql一样原生提供字典形式的游标. cursor = conn.cursor(pymysql.cursors.DictCursor) 但官方文档里已经有预留了相应的实 ...

  4. Android总结篇系列:Android Service

    Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面,因此,从实际业务需求上来理解,Service的适用场景应该具备以下条件: ...

  5. Could not publish to the server. java.lang.NullPointerException

    右键单击tomcat服务器,找到Properties,点下switch location就好了.

  6. Linux更改主机名--适用于Centos

    1.显示主机名: [root@bogon:~]# hostnamezhh64 2.临时修改主机名: [root@bogon:~]# hostname zzofs[root@bogon:~]# host ...

  7. 与锤子手机HR的对话——创业没有联合创始人,CTO 等高管会把它当做自己的事业吗?

    以下对话,是在被之前的锤子HR磨叽2周约面试折腾的火大的心态下进行…… 这个问题发到知乎,被一群人骂啊……cnblogs都是工程师,估计懂期权参加创业的同学多一些,有空前往知乎声援一下……在这里:ht ...

  8. C#实现类似"hello $world"的格式化字符串方法

    C#自带的string.Format可以格式化字符串,但是还是不太好用,由于格式的字符占位符都是数字,当数目较多时容易混淆.其实可以扩展string的方法,让C#的字符串具备其他的方法,下面介绍一个实 ...

  9. Heatmap.js v2.0 – 最强大的 Web 动态热图

    Heatmap 是用来呈现一定区域内的统计度量,最常见的网站访问热力图就是以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示.Heatmap.js 这个 JavaScript 库可以实现 ...

  10. CSS常用标签

    CSS常用标签 一 CSS文字属性 color : #999999; /*文字颜色*/ font-family : 宋体,sans-serif; /*文字字体*/ font-size : 9pt; / ...