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

MySQLで特定の行を選択する方法:FIND_IN_SET関数の使い方を実例付きで解説

MySQLでカンマ区切りの値が格納された列から、特定の値を含む行だけを抽出したい場合があります。そのようなときに便利なのが FIND_IN_SET() 関数です。この記事では、実際にテーブルを作成しながら、FIND_IN_SET() を使って特定の行を選択する方法を順を追って解説します。

FIND_IN_SET() 関数とは

FIND_IN_SET() は、第2引数に指定したカンマ区切りの文字列リストの中に、第1引数の値が含まれているかどうかを調べる関数です。値が見つかった場合はその位置(1から始まる番号)を返し、見つからない場合は 0 を返します。この特性を利用することで、WHERE句と組み合わせて特定の行を効率的に抽出できます。

サンプルテーブルの作成

まず、カンマ区切りの値を格納するテーブルを作成しましょう。

mysql> create table DemoTable
    (
    ListOfValues varchar(200)
    );
Query OK, 0 rows affected (0.31 sec)

次に、INSERTコマンドを使っていくつかのレコードを挿入します。

mysql> insert into DemoTable values('112,114,567,Java,345');
Query OK, 1 row affected (0.06 sec)

mysql> insert into DemoTable values('222,214,256');
Query OK, 1 row affected (0.06 sec)

mysql> insert into DemoTable values('2,567,98,C');
Query OK, 1 row affected (0.06 sec)

登録データの確認

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

mysql> select *from DemoTable;

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

+----------------------+
| ListOfValues         |
+----------------------+
| 112,114,567,Java,345 |
| 222,214,256          |
| 2,567,98,C           |
+----------------------+
3 rows in set (0.00 sec)

FIND_IN_SET() で特定の行を選択するクエリ

それでは、「2」という値が含まれている行だけを抽出してみましょう。以下のようなクエリを実行します。

mysql> select *from DemoTable where find_in_set('2',ListOfValues) >0;

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

+--------------+
| ListOfValues |
+--------------+
| 2,567,98,C   |
+--------------+
1 row in set (0.03 sec)

結果の解説

find_in_set('2', ListOfValues) > 0 という条件により、「2」がリスト内に存在する行のみが返されました。

  • 1行目「112,114,567,Java,345」には「2」が含まれていないため除外されます。
  • 2行目「222,214,256」には「222」「214」「256」という値はありますが、「2」単体の値は含まれていないため除外されます。
  • 3行目「2,567,98,C」には「2」が含まれているため、該当行として返されます。

注意点

FIND_IN_SET() は完全一致で判定されるため、LIKE '%2%' のような部分一致検索とは挙動が異なります。例えば LIKE 検索では「222」や「214」もヒットしてしまいますが、FIND_IN_SET() を使えばカンマ区切りの要素として正確に「2」だけをマッチさせることができます。

また、大量のデータを扱う場合は FIND_IN_SET() による検索にインデックスが利用できずパフォーマンスが低下する可能性があるため、正規化されたテーブル設計やJSON型カラムの利用も検討するとよいでしょう。

  1. MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】

    MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。 1. サンプルテーブルの作成 まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。 mysql> CREATE table tblSelectDemo - > ( - > id int, - > name varchar(100) - > );

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected