MySQLで特定の番号を含むレコードをすべて選択する方法|FIND_IN_SET()関数の使い方
MySQLで、カンマ区切りの値の中に特定の番号が含まれているレコードをすべて抽出したい場合は、FIND_IN_SET() 関数を使用します。この関数は、文字列リストの中から指定した値が何番目に存在するかを返し、見つからない場合は 0 を返します。そのため、結果が 0 より大きいかどうかを条件にすることで、目的の番号を含むレコードだけを取得できます。
ここでは、実際にテーブルを作成して動作を確認してみましょう。
1. テーブルの作成
まず、サンプル用のテーブルを作成します。
mysql> create table demo73
-> (
-> interest_id varchar(100),
-> interest_name varchar(100)
-> );
Query OK, 0 rows affected (1.48 sec)2. レコードの挿入
次に、INSERT文を使ってデータを挿入します。interest_id カラムには、カンマ区切りの番号リストを格納しています。
mysql> insert into demo73 values("100,101,103,105","SSC");
Query OK, 1 row affected (0.34 sec)
mysql> insert into demo73 values("105,103,1005,1003,104","Computer");
Query OK, 1 row affected (0.10 sec)
mysql> insert into demo73 values("110,105,104,111","Novel");
Query OK, 1 row affected (0.31 sec)3. テーブルの内容を確認
SELECT文で登録されたレコードを表示します。
mysql> select *from demo73;
実行すると、以下のような結果が出力されます。
+-----------------------+---------------+ | interest_id | interest_name | +-----------------------+---------------+ | 100,101,103,105 | SSC | | 105,103,1005,1003,104 | Computer | | 110,105,104,111 | Novel | +-----------------------+---------------+ 3 rows in set (0.00 sec)
4. 特定の番号を含むレコードを検索する
それでは本題です。「103」という番号を含むレコードをすべて取得するには、以下のように WHERE 句と組み合わせて FIND_IN_SET() を使用します。
mysql> select *from demo73 where find_in_set("103",interest_id) > 0;実行結果は次のとおりです。
+-----------------------+---------------+ | interest_id | interest_name | +-----------------------+---------------+ | 100,101,103,105 | SSC | | 105,103,1005,1003,104 | Computer | +-----------------------+---------------+ 2 rows in set (0.00 sec)
解説
FIND_IN_SET("103", interest_id) は、interest_id の値(例:「100,101,103,105」)をカンマ区切りのリストとして扱い、「103」がリスト内に存在すればその位置(1以上の整数)を返します。存在しない場合は 0 を返すため、> 0 という条件を付けることで、「特定の番号を含むレコードのみ」を正確に抽出できます。
なお、この方法は「100」を検索した場合に「1005」や「1003」まで誤ってヒットさせるような単純な LIKE 検索とは異なり、リスト要素を厳密に比較できる点が大きなメリットです。
-
MySQLのREGEXPで特定の単語数のみのレコードを抽出する方法
MySQLのREGEXPで特定の単語数のみのレコードを抽出する方法 カラム内に含まれる単語数が特定の数(例:2語)であるレコードだけを取得したい場合は、MySQLの正規表現(REGEXP)を利用すると便利です。基本となる構文は以下のとおりです。 select * from yourTableName where yourColumnName regexp \land[\land ]+[ ]+[\land ]+$; このクエリは、2つの単語がスペースで区切られている場合にマッチします。それでは、実際にサンプルテーブルを作成して動きを確認してみましょう。 テーブルの作成 まず、CREATE TAB
-
MySQLでカンマ区切りの値から特定の数値を含むレコードをすべて選択する方法
MySQLで特定の数値を含むレコードを抽出するには?カンマ区切りで保存された値の中に、特定の数値が含まれているレコードをすべて取得したい場合は、concat() 関数と LIKE 演算子を組み合わせて使用します。基本の構文は以下のとおりです。select *from yourTableName where concat(,, yourColumnName, ,) like %,yourValue,%;この方法のポイント単純に LIKE %4% とすると、「14」や「40」など意図しない数値までマッチしてしまう可能性があります。そこで、列の値の前後を concat() でカンマで囲むことで、「4