LoginSignup
3
2

More than 5 years have passed since last update.

mysqlのgroup_concatで@OneToManyをカンマ区切りにしてCSV出力

Posted at

下記の記事と思い切りネタかぶりなので大変恐縮なのですが、すこし前に自分も使ったので、ユースケースの共有ということで。
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側で解決する(押し付ける?)テクニックのひとつです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2