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

MySQLでカンマ区切りの複数IDを含む特定の行を検索するには?FIND_IN_SET()の使い方

MySQLでは、1つのカラムにカンマ区切りで複数のIDが格納されているケースがあります。そのようなデータから特定のIDを含む行だけを抽出したい場合、FIND_IN_SET() 関数を使うのが最も簡単で確実な方法です。この記事では、実際のサンプルコードと出力例をもとに、具体的な手順をわかりやすく解説します。

1. サンプルテーブルを作成する

まず、検索対象となるテーブルを作成しましょう。ここでは、カンマ区切りのIDリストを格納する「ListOfIds」という VARCHAR 型(最大200文字)のカラムを持つテーブルを用意します。

mysql> create table DemoTable
    -> (
    -> ListOfIds varchar(200)
    -> );
Query OK, 0 rows affected (0.72 sec)

2. レコードを挿入する

続いて、INSERT 文を使ってカンマ区切りのIDを含むレコードを3件追加します。

mysql> insert into DemoTable values('100,2093,678,686');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values('0595,9585,4885,95959');
Query OK, 1 row affected (0.20 sec)

mysql> insert into DemoTable values('0059954,95986884,9059596,9005');
Query OK, 1 row affected (0.20 sec)

3. 登録データを確認する

SELECT 文ですべてのレコードを表示し、データが正しく登録されているか確認しておきましょう。

mysql> select *from DemoTable;

出力結果

+-------------------------------+
| ListOfIds                     |
+-------------------------------+
| 100,2093,678,686              |
| 0595,9585,4885,95959          |
| 0059954,95986884,9059596,9005 |
+-------------------------------+
3 rows in set (0.00 sec)

4. FIND_IN_SET()で特定のIDを含む行を検索する

カンマ区切りのIDリストから特定のIDを持つ行を検索するには、WHERE 句の中で FIND_IN_SET() を使用します。以下は、「9005」というIDを含む行を抽出するクエリの例です。

mysql> select *from DemoTable where FIND_IN_SET('9005', ListOfIds);

出力結果

+-------------------------------+
| ListOfIds                     |
+-------------------------------+
| 0059954,95986884,9059596,9005 |
+-------------------------------+
1 row in set (0.00 sec)

実行結果を見ると、「9005」を含む1件の行だけが正しく取得できていることがわかります。

FIND_IN_SET() の仕組み

FIND_IN_SET(検索文字列, 対象文字列) は、第2引数で渡したカンマ区切りのリストの中に、第1引数の文字列が何番目に存在するかを返す関数です。見つかった場合は位置(1以上の整数)、見つからなかった場合は 0 を返すため、WHERE 句の条件式としてそのまま利用できます。

また、LIKE '%9005%' のような部分一致検索では「90050」や「19005」なども誤ってヒットしてしまう恐れがありますが、FIND_IN_SET() はカンマ区切りの要素単位で完全一致を判定するため、このような誤検出を防げる点が大きなメリットです。

まとめ

MySQLでカンマ区切りの複数IDを含む行を検索するなら、FIND_IN_SET() 関数を使うのが最もシンプルで確実です。ただし、カンマ区切りの値を1つのカラムへ格納する設計は第一正規形に反するため、インデックスが効かず、データ量が増えるとパフォーマンスが低下しやすい点には注意が必要です。検索頻度が高い本番環境では、中間テーブルを用いた正規化もあわせて検討するとよいでしょう。

  1. MySQLでテーブルから特定の行を抽出するクエリの書き方

    MySQLでは、WHERE句とORDER BY、LIMITを組み合わせることで、テーブルから条件に合致する特定の行だけを効率的に取得できます。本記事では、実際にサンプルテーブルを作成し、特定の行を抽出するクエリの実行手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使ってサンプル用のテーブルを作成します。ここでは「Section(組)」と「StudentName(生徒名)」という2つのカラムを持つテーブルを用意しました。 mysql> create table DemoTable1972 ( Section char(1),

  2. MySQLで同じIDを持つレコードを特殊文字区切りで1行に連結するクエリ(CONCAT_WS+GROUP_CONCAT)

    同じIDを持つ複数のレコードを、特殊文字で区切りながら1行にまとめて連結したい場合には、CONCAT_WS()とGROUP_CONCAT()を組み合わせて使用するのが効果的です。この記事では、実際にテーブルを作成し、レコードを連結するまでの手順を順番に解説します。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable2016     -> (     -> UserId int,