mysql group_concatとfind_in_setのまとめ

group_concatはgroup byで複数行をまとめた際に、まとめられた列のデータをカンマ区切りで表示する機能。

find_in_setはカンマ区切りのデータを絞り込む機能。

この2つを組み合わせることで、本来なら副問合せ等の複数のSQLに分けないと出来ないようなことが一つのSQLで完結できることが分かった。

ただ速度的なメリットがあるのかどうかは不明。

参考ページの例を使うと以下のようなsqlでmarketとsalesに所属するempを一発で取得できる。

select dept_emp.empid, emp.name, GROUP_CONCAT(dept.name order by dept.id) as dept_n
from dept_emp left join emp on dept_emp.empid=emp.id
left join dept on dept_emp.deptid=dept.id
group by dept_emp.empid
having find_in_set('market', dept_n) and find_in_set('sales', dept_n);

結果

+-------+-------+------------------+
| empid | name  | dept_n           |
+-------+-------+------------------+
|     3 | smith | market,hrm,sales |
+-------+-------+------------------+
1 row in set (0.00 sec)

参考ページ
GROUP_CONCAT関数の便利さは異常 - 開発の風景 〜KKZのSE日記〜
MySQL :: find_in_set() 関数 [Tipsというかメモ]
商品とそれに紐付けされた複数のカテゴリ情報を一つのSQLで取得する - Qiita