質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

5525閲覧

1対多で結びついたテーブルをうまくcsvに落とし込みたい

yam_yanu

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2014/08/09 13:41

例えば
ユーザーの情報を持ったテーブルusers(id,name)と
趣味テーブルhobbies(id,name)と
ユーザーの趣味を持つテーブルuser_infos(id,user_id,hobby_id)
があったとしてそれを

Aさん,野球,プログラム,アニメ
Bさん,野球
Cさん,サッカー,テレビ

といったようにユーザーが持つ趣味の個数にあわせて、
列数を変更しながらcsvを出したいのですが可能でしょうか。
可能でしたらSQL等を教えてください。

ちなみに普通にjoinすると
Aさん,野球
Aさん,プログラム
Aさん,アニメ
Bさん,野球
Cさん,サッカー
Cさん,テレビ
と言った感じでcsvになります。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

MySQLであれば、GROUP_CONCATという関数がありますので、それを利用すれば良いかと思います。

詳細は、MySQLのマニュアル
http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
の「 GROUP_CONCAT(expr)」の項をご覧ください。

上記項目に、システム変数「group_concat_max_len」についての注意事項も記載されております。

重要な項目ですので、GROUP_CONCATを利用する際は必ずご一読ください。

以下サンプルコード。
※同姓同名の方がいらっしゃる場合を考慮し、users.nameではなくusers.idでグルーピングしています。
※user_infosが登録されていない人も取得するため、usersとuser_infosをLEFT JOINしています。
user_infosが登録されていない人は抽出不要であれば、usersとuser_infosの結合を
LEFT JOIN⇒INNER JOINに変更してください。

`
-- システム変数「group_concat_max_len」の値を、大きい値に変更する(10000は仮)。
-- ※デフォルト値で問題なく動作するようであれば、この行は実行不要です。
SET group_concat_max_len = 10000;

-- データ取得SQL(ユーザー毎に、hobbies.id順に並んだhobbies.nameを','で結合して取得)
SELECT
users.id,
users.name,
GROUP_CONCAT(hobbies.name order by hobbies.id asc separator ',')
FROM
users
LEFT JOIN
user_infos
ON
users.id = user_infos.user_id
LEFT JOIN
hobbies
ON
hobbies.id = user_infos.hobby_id
GROUP BY
users.id,
users.name;

`

[2014/08/14追記]
すみません、サンプルコード内に誤字(テーブル名のスペルミス)があったので修正しました。

投稿2014/08/11 04:18

nak

総合スコア696

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yam_yanu

2014/08/13 14:18

group_contactは知りませんでした! 是非活用させていただきます。
nak

2014/08/14 04:32

コメントありがとうございます! お役に立てば幸いです。
guest

0

『ユーザーの趣味』の種類数がわかっているのであれば、left join を繰り返すことで可能ではあります。
例えば、趣味が

  • 野球
  • サッカー
  • プログラム
  • テレビ
  • アニメ

の5種類しかない場合などです。

ただし、
Aさん, 野球, , プログラム, , アニメ Bさん, 野球, , , , Cさん, , サッカー, , テレビ,
のように空白列が発生してしまいます。

投稿2014/08/10 09:16

tebonz

総合スコア198

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yam_yanu

2014/08/10 09:44

解答ありがとうございます! ちなみに趣味の数は決まっているのですが、100個くらいあります。 地道にjoinしていくしかないのでしょうか,,?
tebonz

2014/08/14 17:22

私が記載したやり方だと地道にjoinすることになりますね。 なのでnakさんの回答の方が圧倒的に優れていると思います。 私も勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問