2017-12-05 13 views
0

users、ap_name_bank_mおよびap_name_bank_hという3つのテーブルがあります。 usersテーブルには、3つのカラム 'name_eng'(英語のユーザ名)、 'name_gdn_eng'(ユーザの保護者の名前)、 'category'があります。無限ループに入るテキストの挿入時のMySQLトリガー

ap_name_bank_mとap_name_bank_hは、それぞれのカテゴリの名前のコーパス( 'm'または 'h')です。

行が更新されるとき、私は両方の名前の各単語が現在の2つのテーブル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 ; 
+0

なぜループが終了するのですか –

+0

@ P.Salmonそれを入手しました。どのようにループから単語を削除するには? – Naveed

+0

単語が空であるかヌルである場合にループを終了します。 –

答えて

0

私はこれを行うより良い方法を発見しました。ループの必要はありません。

BEGIN 
declare words text; 
declare word varchar(50); 
declare num_m int default 0; 
declare num_h int default 0; 

set words = concat(new.name_eng,' ',new.name_gdn_eng); 

set num_h = (select count(*) from ap_name_bank_h where match(name) against (words in natural language mode)); 

set num_m = (select count(*) from ap_name_bank_m where match(name) against(words in natural language mode)); 

/* 
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 
関連する問題