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