• ベストアンサー

テーブルの結合・・・

教室テーブル id, class 1, A組 2, B組 3, C組 生徒テーブル id, name 1, 佐藤 1, 山田 2, 鈴木 3, 田中 3, 後藤 3, 加藤 という二つのテーブルがあります。 これらをLEFT JOINで結合したのですが。 A組, 佐藤 A組, 山田 B組, 鈴木 C組, 田中 C組, 後藤 C組, 加藤 となってしまいます。 これを同じ教室名でまとめて、 A組, 佐藤 山田 B組, 鈴木 C組, 田中 後藤 加藤 というように表示したいのです。 できればクエリだけで解決したいのですが・・・ よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

group byとgroup_concat関数を調べてみましょう。 http://dev.mysql.com/doc/refman/4.1/ja/group-by-functions.html group_concat関数は、他のRDBMSでは類似機能を見かけない珍しい機能です。

madman666
質問者

お礼

回答ありがとうございます。 group_concatを使って、思っていたとおりのことができました。 しかし、もう一つ知っておきたいのですが、 group_concatのように、セパレーターを使って一つの列につめこむのではなくて、空の列を作って一つずつ格納する方法をご存じでしたら、どうかご教授いただきたいのですが・・・ よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

#2回答者です。 >空の列を作って一つずつ格納する方法 受け取る列数を可変にするのは、SQLだけでは困難です。もしSQLでやろうとすれば、最大の列数を固定にし、その個数分をジョインするとか、サブクエリするといった方法になり、冗長で性能を出せないSQLになってしまいます。 また、MySQLに限定するなら、group_concat関数の結果を利用して、それを最大列数分に関数を駆使して分割するといった方法も考えられますが、非常に冗長なSQLになります。 したがってアプリケーションでやるとか、MySQL 5.0以降ならストアド・プロシジャを使用するといった方法のほうがシンプルに行えます。

madman666
質問者

お礼

何度もありがとうございます。 MySQL 5.0は以降なので、 ストアドプロシジャやビューが使えるので、それを使ってやろうかと思うのですが、 いまいちイメージが沸きません; 「空の列を作って格納する」ためのクエリを、だいたいのイメージでもいいので、教えていただけないでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

基本的にはSQLの仕事じゃないですが、どうしてもできないわけではないかな やるべきではないと思いますが・・・ とりあえずバージョンは? それと、「佐藤 山田」とあるのは佐藤と山田は別の列でしょうか? それとも半角スペースをセパレータとして同じ列に表示したいのでしょうか?

madman666
質問者

お礼

MySQLのバージョンは5.0.51aです。 「佐藤 山田」というのは、同じ列です。 おっしゃるとおり半角スペースで区切って同じ列に表示したいのです。 ちなみに、同じ列ではない場合、どんな感じになるのでしょうか? 該当する人数分だけ自動で列が足されるのでしょうか? よろしくお願いします。

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • アメリカで購入したHP-2-MHを日本に持ち帰り、使用するためにはサードパーティー製の100V仕様のACコードが必要です。
  • Rolandでは純正パーツが残っていないため、どのサードパーティー製のコードを購入すればよいか教えてください。
  • 具体的にどのメーカーのどの部品かも教えていただけると助かります。
回答を見る