MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

【MySQL】FIND_IN_SET()を使ってカンマ区切りの値から一致するレコードを抽出する方法

カンマ区切りの値から特定のレコードを取得するには

MySQLでカンマ区切り(CSV形式)の文字列が格納されたカラムから、特定の値を含むレコードを検索したい場合は、FIND_IN_SET() 関数を使用します。FIND_IN_SET() は、第1引数で指定した文字列が、第2引数のカンマ区切りリスト内に存在するかどうかを判定し、存在すればその位置を返します。

この記事では、実際にテーブルを作成し、FIND_IN_SET() を使ったデータ抽出の手順を解説します。

1. サンプルテーブルの作成

まず、学生の点数リストをカンマ区切りで保持するテーブルを作成します。

mysql> create table DemoTable1548
   -> (
   -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> StudentName varchar(20),
   -> ArrayListOfMarks varchar(100)
   -> );
Query OK, 0 rows affected (0.88 sec)

2. テストデータの挿入

INSERT文を使って、いくつかのレコードを登録します。

mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Chris','56,78,90,87');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Bob','90,78,65');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('David','91,34,56,78,87');
Query OK, 1 row affected (0.16 sec)

3. 登録データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1548;

実行結果は以下のとおりです。

+-----------+-------------+------------------+
| StudentId | StudentName | ArrayListOfMarks |
+-----------+-------------+------------------+
|         1 | Chris       |    56,78,90,87   |
|         2 | Bob         |       90,78,65   |
|         3 | David       | 91,34,56,78,87   |
+-----------+-------------+------------------+
3 rows in set (0.00 sec)

4. FIND_IN_SET()で一致するレコードを抽出

ここで本題です。カンマ区切りの値の中に「87」が含まれているレコードだけを取得するには、WHERE句で FIND_IN_SET() を次のように使用します。

mysql> select * from DemoTable1548 where find_in_set('87',ArrayListOfMarks);

実行結果は以下のとおりです。「87」を含む Chris と David のレコードのみが抽出されました。

+-----------+-------------+------------------+
| StudentId | StudentName | ArrayListOfMarks |
+-----------+-------------+------------------+
|         1 | Chris       |    56,78,90,87   |
|         3 | David       | 91,34,56,78,87   |
+-----------+-------------+------------------+
2 rows in set (0.00 sec)

補足:LIKE検索との違い

同様の検索は LIKE '%87%' でも実現できますが、この場合「870」や「187」など、意図しない値までマッチしてしまう可能性があります。FIND_IN_SET() はカンマ区切りの要素単位で完全一致を判定するため、こうした誤マッチを防げるのが大きな利点です。ただし、カンマ区切りの文字列をカラムに格納する設計はインデックスが効かずパフォーマンス面で不利なため、本格的な運用では正規化やJSON型カラムの利用も検討するとよいでしょう。

  1. 【MySQL】STR_TO_DATEを使って異なる形式の日付から特定日以降のレコードを取得する方法

    はじめにデータベースの運用では、日付が「21/11/2019」のような文字列形式(DD/MM/YYYY)で保存されているケースによく出会います。このような場合、UNIX_TIMESTAMP() の代わりに STR_TO_DATE() 関数を使うことで、文字列の日付を正しく変換し、特定の日付以降のレコードを簡単に抽出できます。本記事では、実際のSQL例を使いながら、その手順をわかりやすく解説します。1. サンプルテーブルの作成まず、日付をvarchar型で保持するテーブルを作成します。mysql> create table DemoTable1808 ( Admission

  2. MySQLでランダムな行を取得する方法|ORDER BY RAND()を使った抽出テクニック

    MySQLでランダムな行を取得する基本MySQLでランダムに行を取得したい場合、最も手軽な方法は ORDER BY RAND() を使うことです。この記事では、カンマ区切りの値を格納したデータを例に、特定の値を除外しながらランダムに行を抽出する方法をステップごとに解説します。1. サンプルテーブルを作成するまず、IDのリストを保存するためのシンプルなテーブルを作成します。mysql> create table DemoTable1835    (    ListOfIds varchar(20) &