カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

MySQL IN句とFIND_IN_SET関数

この記事は最終更新日から1年以上経過しています。

MySQLの抽出条件の指定方法としてIN句とFIND_IN_SET関数というものがあります。
その具体的な使用方法をご紹介します。

サンプルとしてテーブル「sample」を用意します。

mysql> select * from `sample`;
+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 3  | 宇野   | 3    |
| 4  | 江崎   | 1    |
| 5  | 奥本   | 2    |
+----+--------+------+

IN句

例えば、idが1・2・4のデータを取得したいとき、
IN句を使うとこのように抽出することができます。

SELECT * FROM sample WHERE id IN (1, 2, 4);

結果は以下のようになります。

+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 4  | 江崎   | 1    |
+----+--------+------+

FIND_IN_SET関数

IN句のときと同様にidが1・2・4のデータを取得してみましょう。

SELECT * FROM sample WHERE FIND_IN_SET(id, '1,2,4');

こちらも結果はIN句を使ったときと同じ結果になります。

さて、同じ結果であれば何が違うの?となりますよね。
こちらのFIND_IN_SET関数の場合だと変数を使うことができるのです。

例えばこのように書くことができます。

SET @ids = '1,2,4';
SELECT * FROM sample WHERE FIND_IN_SET(id, @ids);

ストアドプロシージャ等で引数を受けて処理をする場合などに使うことができます。
IN句だとこのような使い方ができないところが大きな違いです。

おまけ GROUP_CONCAT関数

GROUP_CONCAT関数と先ほどのFIND_IN_SET関数を組み合わせることで上手なSQLを組み立てることができます。

テーブル「sample」に加えて「names」というテーブルを用意します。

mysql> select * from `names`;
+----+--------+
| id | name   |
+----+--------+
| 1  | 赤井   |
| 2  | 井田   |
| 3  | 江崎   |
+----+--------+

まずはGROUP_CONCAT関数の基本的な使い方

SELECT GROUP_CONCAT(name) AS name_list FROM names;

こうすると結果は次のようになります。

赤井,井田,江崎

この結果を変数に格納し、FIND_IN_SET関数を使ってテーブル「sample」からデータを抽出します。

SELECT GROUP_CONCAT(name) INTO @name_list FROM names;

SELECT * FROM sample WHERE FIND_IN_SET(name, @name_list);

結果は以下のようになります。

+----+--------+------+
| id | name   | type |
+----+--------+------+
| 1  | 赤井   | 1    |
| 2  | 井田   | 2    |
| 4  | 江崎   | 1    |
+----+--------+------+

その他、GROUP_CONCAT関数では
並び替えをしたり

SELECT GROUP_CONCAT(name ORDER BY type) AS name_list FROM names;

重複を省いたり

SELECT GROUP_CONCAT(DISTINCT(name)) AS name_list FROM names;

区切り文字の変更ができます。

SELECT GROUP_CONCAT(name SEPARATOR '/') AS name_list FROM names;

最後に、GROUP_CONCAT関数はMySQL独自の関数です。
また、文字列の長さには上限がありますのでご注意ください。
文字列の長さ上限はシステム環境変数のgroup_concat_max_lenを参照してください。

この記事がお役に立ちましたらシェアお願いします
2,835 views

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です