【发布时间】:2017-12-05 07:47:11
【问题描述】:
共有三个表:users、ap_name_bank_m 和 ap_name_bank_h。 users 表包含三列“name_eng”(用户英文名)、“name_gdn_eng”(用户监护人英文名)和“类别”。
ap_name_bank_m 和 ap_name_bank_h 是每个名称类别的名称语料库:“m”或“h”。
当一行更新时,我想检查两个名称的每个单词是否存在于两个表 ap_name_bank_m 和 ap_name_bank_h 中。
将分配该类别的计数较高的那个。我编写的以下代码进入无限循环,我收到“MySQL 服务器已消失错误”。谁能告诉我哪里错了?
假设 name_eng 和 name_gdn_eng 将只包含带空格的单词,没有其他内容。
DELIMITER $$
create trigger set_cat before update on users_table for each row
BEGIN
declare words text;
declare word varchar(50);
declare num_m int default 0;
declare num_h int default 0;
declare len int default 0;
set words = concat(new.name_eng,' ',new.name_gdn_eng);
iterator:
LOOP
set word = substring_index(words,' ',1);
set num_m = EXISTS(select 1 from ap_name_bank_m where name=word) + num_m;
set num_h = EXISTS(select 1 from ap_name_bank_h where name=word) + num_h;
set words = trim(replace(words,word,''));
END LOOP iterator;
if (num_m > num_h) then set new.category='M'; end if;
if (num_h > num_m) then set new.category='H'; end if;
END $$
DELIMITER ;
【问题讨论】:
-
循环为什么要终止
-
@P.Salmon 知道了。那么如何从循环中删除单词呢?
-
words为空或null时退出循环。