- MySQL
- 2022-10-06 - 更新:2022-12-13
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
を参照してください。