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

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 検索とは異なり、リスト要素を厳密に比較できる点が大きなメリットです。

  1. MySQLのREGEXPで特定の単語数のみのレコードを抽出する方法

    MySQLのREGEXPで特定の単語数のみのレコードを抽出する方法 カラム内に含まれる単語数が特定の数(例:2語)であるレコードだけを取得したい場合は、MySQLの正規表現(REGEXP)を利用すると便利です。基本となる構文は以下のとおりです。 select * from yourTableName where yourColumnName regexp \land[\land ]+[ ]+[\land ]+$; このクエリは、2つの単語がスペースで区切られている場合にマッチします。それでは、実際にサンプルテーブルを作成して動きを確認してみましょう。 テーブルの作成 まず、CREATE TAB

  2. MySQLでカンマ区切りの値から特定の数値を含むレコードをすべて選択する方法

    MySQLで特定の数値を含むレコードを抽出するには?カンマ区切りで保存された値の中に、特定の数値が含まれているレコードをすべて取得したい場合は、concat() 関数と LIKE 演算子を組み合わせて使用します。基本の構文は以下のとおりです。select *from yourTableName where concat(,, yourColumnName, ,) like %,yourValue,%;この方法のポイント単純に LIKE %4% とすると、「14」や「40」など意図しない数値までマッチしてしまう可能性があります。そこで、列の値の前後を concat() でカンマで囲むことで、「4