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型カラムの利用も検討するとよいでしょう。
-
MySQLで再帰的なSELECTクエリを実行する方法【初心者向けに具体例つきで解説】
MySQLでは、ユーザー定義変数(セッション変数)を活用することで、再帰的なSELECTクエリを実現できます。本記事では、実際にテーブルを作成し、データを挿入したうえで、再帰的なSELECTの具体的な書き方を順を追って解説します。 1. サンプルテーブルの作成 まず、再帰的なSELECTを試すためのサンプルテーブルを作成します。テーブルの作成にはCREATEコマンドを使用します。 mysql> CREATE table tblSelectDemo - > ( - > id int, - > name varchar(100) - > );
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected