MySQLで商品を扱うようなテーブルがあります。
SQL
1CREATE TABLE tb_items 2 ( 3 ID int NOT NULL, 4 Name varchar(256), 5 Brand varchar(32), 6 Category varchar(32), 7 Status boolean, 8 PRIMARY KEY(ID), 9 INDEX(Name, Brand, Category) 10 )
上記カラムの意味は順に、「商品ID, 商品名, 製造元, カテゴリ, ステータス」となります。
このテーブルにはデータが数百万件入っているとします。
もう一つ、上記テーブルをキーワードでフィルタリングするためのキーワード用テーブルがあります。
SQL
1CREATE TABLE tb_filter_keyword 2 ( 3 ID int NOT NULL auto_increment, 4 Keyword varchar(24), 5 Type varchar(8), 6 PRIMARY KEY(ID), 7 INDEX(Keyword) 8 )
上記カラムの意味は順に「キーワード, フィルターを掛けるカラム名」となります。
「フィルターを掛けるカラム名」とは、tb_itemsのどのカラムに対してフィルタリングするかという意味で、値は「Name, Brand, Category」が入ります。
そしてこのテーブルにはキーワードが1万件入っているとします。
ここから質問なのですが、数百万件あるtb_itemsの全行に対して、tb_filter_keywordのキーワードがName, Brand, Categoryのいずれかに含まれる場合、その行のStatusを1に、含まない場合は0にしたいです。
このようなクエリーはfor文で回してLIKE %keyword%で検索し、一つずつ更新していくしかないのでしょうか?
それとももっと効率の良い方法などがあるのでしょうか?
テンポラリーテーブルを作ったり、抽出した新たなテーブルを作ったり、など効率が良ければどのような方法でも構いません。商品数が数百万件、キーワードが1万件ありますので効率の良い方法をお聞きしたいです。
どうぞよろしくお願い致します。