下記の記事と思い切りネタかぶりなので大変恐縮なのですが、すこし前に自分も使ったので、ユースケースの共有ということで。
http://qiita.com/kyuu1999/items/93b02128f07c577b3e48
実際のテーブルは違うのですが、単純化のために別の例で説明します。
Redmineのプロジェクトをイメージして、下記のようなテーブルがあるとします。
- Project
- Project_Member
- User
- Ticket
プロジェクトに、ユーザとチケットが1:nで関連づけられているとします。
このとき、プロジェクト毎に、メンバー名とチケット番号のリストをカンマ区切りしたものを全件出力してというようなときにgroup_concatを使いました。下のようなcsvを作るイメージです。
project.csv
プロジェクト名,メンバー,チケット
プロジェクトA,"○山,△田,□村","#1,#2,#3"
...
基本方針は「group_concatでカンマ区切りにしたテーブルとjoin」でいきます。
sample.sql
SELECT
Project.id,
Project.name,
pm.members,
pt.tickets
FROM Project
LEFT JOIN (select project_id, group_concat(user_id) members FROM Project_Member GROUP BY project_id) pm ON Project.id = pm.project_id
LEFT JOIN (select project_id, concat('#', id) tickets FROM Ticket GROUP BY project_id) pt ON Project.id = pt.project_id
あとは、これをもとにCSVライブラリで書き出すか、SQLだけでがんばって整形すればという感じです。
ORMの機能だとSQLのN+1問題になる場合の回避策や、(パフォーマンスの要件がゆるいなら)カンマ区切りにしたのをビューテーブルにしてそれとマッピングさせて困難を分割する、というときに使えると思います。
まとめ
ORMだけだときびしいというときに、その難しさをSQL側で解決する(押し付ける?)テクニックのひとつです。