【MySQL】FIND_IN_SET()でカンマ区切りのリストからレコードを取得する方法
カンマ区切りで保存されたリストの一部を条件にレコードを取得したい場合は、MySQLの組み込み関数 FIND_IN_SET() を使うと簡単に実現できます。
サンプルテーブルを作成する
まず、テーブルを作成しましょう。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20),
Marks varchar(200)
);
Query OK, 0 rows affected (0.61 sec)
次に、INSERT文を使っていくつかのレコードを挿入します。Marksカラムには、点数がカンマ区切りの文字列として格納されている点に注目してください。
mysql> insert into DemoTable(Name,Marks) values('Larry','98,34,56,89');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Name,Marks) values('Chris','67,87,92,99');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Name,Marks) values('Robert','33,45,69,92');
Query OK, 1 row affected (0.22 sec)
SELECT文でテーブルの中身を確認してみます。
mysql> select *from DemoTable;
実行結果は以下の通りです。
+----+--------+-------------+ | Id | Name | Marks | +----+--------+-------------+ | 1 | Larry | 98,34,56,89 | | 2 | Chris | 67,87,92,99 | | 3 | Robert | 33,45,69,92 | +----+--------+-------------+ 3 rows in set (0.00 sec)
FIND_IN_SET()でカンマ区切りの値を検索する
それでは本題です。カンマ区切りのリスト内に特定の値が含まれているかどうかでレコードを絞り込むには、WHERE句でFIND_IN_SET()を使用します。
ここでは、「点数99を持つ学生」のレコードを取得してみましょう。
mysql> select Id,Name from DemoTable where find_in_set('99',Marks) > 0;
実行結果は以下の通りです。
+----+-------+ | Id | Name | +----+-------+ | 2 | Chris | +----+-------+ 1 row in set (0.00 sec)
Marksカラムに「99」が含まれているのはChrisのレコードだけなので、該当する1件だけが返されました。
FIND_IN_SET()の仕組み
FIND_IN_SET(検索値, 対象文字列) は、カンマ区切りの文字列の中に検索値が存在する場合、その位置(1始まりのインデックス)を返します。見つからない場合は「0」を返すため、find_in_set('99', Marks) > 0 のように条件を書くことで、「リスト内に99が含まれるレコード」だけを抽出できるわけです。
注意点: FIND_IN_SET()は正規化されていないデータ設計(第一正規形違反)で使われがちな関数であり、インデックスが効かないため大量データではパフォーマンスが低下します。本番環境では、別テーブルへの分割やJSON型の活用なども検討するとよいでしょう。
-
MySQLでカンマ区切りの値から特定の値を含むレコードを抽出する方法(REGEXP活用)
MySQLでは、REGEXP(正規表現)を使用することで、カンマ区切りの値の中に特定の値が含まれるレコードを簡単に抽出できます。例えば、カンマ区切りの値のいずれかが「90」である行だけを取得したい場合に、正規表現が役立ちます。1. テーブルの作成まず、サンプル用のテーブルを作成します。mysql> create table DemoTable1447 -> ( -> Value varchar(100) -> ); Query OK, 0 rows affected (0.58 sec)2. レコードの挿入INSERT文を使って、カンマ区切りの値
-
MySQLで月の範囲を指定してレコードを取得する方法
MySQLでは、YEAR()関数とMONTH()関数、さらにBETWEEN演算子を組み合わせることで、特定の月の範囲に該当するレコードを簡単に抽出できます。ここでは、前年の7月〜12月と当年の1月〜7月というように、年をまたいだ月の範囲でデータを取得する方法を解説します。 サンプルテーブルの作成 まず、テーブルを作成します。 mysql> create table DemoTable1795 ( Name varchar(20), DueDate date