• ベストアンサー

テーブルの結合・・・

教室テーブル 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

  • テーブル結合方法について

    MySQL5.1で、Table a ,Table b から、Table cのように取り出したいのですが、 SQLでSELECTする方法がわかりません。 Table b優先だけど、Table aにしかデータがない場合もあるといった感じです。 Table a No  Name 1 加藤 2 佐藤 3 田中 Table b No Name 2 佐藤先輩 4 田辺先輩 Table c No Name 1 加藤 2 佐藤先輩 3 田中 4 田辺先輩 どうか、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データの入力を簡略化したい

    次のようなソフトを探しています。 データベースを構築するさい、たとえば ひとつめのテーブル(教室テーブルとする)に ID, 教室名 1, A組 2, B組 3, C組 とあって、もうひとつのテーブル(生徒テーブル)に、 教室ID, 生徒名 1, 山田 1, 田中 2, 鈴木 3, 斉藤 とあるとすると、山田さんと田中さんはA組。鈴木さんはB組、斉藤さんはC組にいることになります。 このふたつめの生徒テーブルにデータを入力していくさい、 わざわざ組テーブルから該当するIDを探して教室を指定しなくてはなりません。 この作業を簡略化することができるソフトを探しています。 つまり、IDではなく教室名で指定できるように、ふたつのテーブルを合体して作業できるようにしたいのです。 大変分かり難い文章だと思いますが、もし理解していただける方がおりましたら、アドバイスをお願いします。

  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • SQLのテーブル結合

    SQLのSELECTについて質問です。 テーブルA、B、Cから情報を取得し、下記の画面イメージを表示させたいのですが、 どのようにテーブルを結合すればよいか判りません。 どなたかご教示ください・・・。よろしくお願いします。 #テーブルCから組名を取得するような処理は画面表示のロジックで行います。 #テーブルA、Bの結合についてのみ、教えていただきたいです。 条件 ・氏名と、所属情報の○×を表示したい ・DISTINCT等、重たい処理は避けたい 画面イメージ |氏名  |赤組|白組|青組| ------------------------------ |山田太郎|○ |× |× | |山田花子|× |○ |○ | テーブルA |個人ID|氏名  | -------------------- |000001|山田太郎| |000002|山田花子| テーブルB |個人ID|組コード| -------------------- |000001|1110  | |000002|1111  | |000002|1112  | テーブルC |組コード|組名| ------------------ |1110  |赤組| |1111  |白組| |1112  |青組|

  • Accessでテーブルの内容を抽出したい

    お世話になります。 Access2000で作成しております。 下記のテーブルAがあります。 名前1とタイム1,名前2とタイム2をセットにして、 テーブルBを作成したいのですが、 どのようにすれば作成できるでしょうか? 可能でしたら、「クエリ」で、説明難しければ「SQL」で 教えていただければと思います。 ※SQLの場合は、クエリに変換して使用します。 ----テーブルA---- 番号 名前1 名前2 名前3 タイム1 タイム2 タイム3 1 山田 田中  佐藤 10 8 9 2 鈴木 木村  戸田 7  8 9 ----テーブルB------ 名前 タイム 山田 10 田中  8 佐藤 9 鈴木 7 ・ ・ -------------------- お手数ですがよろしくお願いいたします。

  • 固定値を含む結合と複数テーブルの結合について

    「1.固定値を含む結合」と「2.複数テーブルの結合」について教えて下さい。 最近oracleを使い始めてSQLで表の結合を書く場面があるんですが LEFT(RIGHT) JOIN を使うのか、(+)を使って書くのかで迷っています。 LEFT(RIGHT) JOINだと固定値を含めて外部結合しようとするとエラーになってしまいます。 それが嫌で(+)を使っていたんですが 今度は複数のテーブルを(+)で結合しようとするとエラーになってしまいます。 (AテーブルとBテーブル、AテーブルとCテーブルなど?) こういう場合はどうすれば良いのでしょうか? とりあえず副参照をFROMに指定して対処してるんですが 何かきちんとした書き方があるのでしょうか?誰か教えて下さい。

  • Accessでテーブルの内容を参照したい

    お世話になります。 Access2000で作成しております。 下記のテーブルAがあります。 名前1とタイム1,名前2とタイム2をセットにして、 Bの形で表示したいのですが、 どのようにすればできるでしょうか? 表現が下手で申し訳ないのですが、 テーブルを作るのではなく、既に存在しているテーブルAの 情報を「参照」して、Bの形で表記したいのです。 可能でしたら、「クエリ」で、説明難しければ「SQL」で 教えていただければと思います。 ※SQLの場合は、クエリに変換して使用します。 ----テーブルA---- 番号 名前1 名前2 名前3 タイム1 タイム2 タイム3 1 山田 田中  佐藤 10 8 9 2 鈴木 木村  戸田 7  8 9 ----B------ 名前 タイム 山田 10 田中  8 佐藤 9 鈴木 7 ・ ・ -------------------- お手数ですがよろしくお願いいたします。

  • 複数テーブルの結合

    マスターテーブル1つと、子テーブルが複数存在して子テーブルにはマスターテーブルのidを格納するフィールドがあり参照しなくなったときにはそのidを消去するといったデータベースがあったときにマスターIDごとに子テーブルのどれか1つでも参照していればカウントするみたいなSQLをつくりたいんですが select count(m.id) from master m inner join a on m.id = a.m_id inner join b on m.id = b.m_id inner join c on m.id = c.m_id group by m.id みたいなSQLだとAにデータが存在しなければB以降に存在しても期待した結果が出力されません。A、B、Cいずれかのm_idとマスター側のIDが等しければカウントするという出力をするためにはどのように書けばいいんでしょうか。 わかりづらい説明で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・

  • テーブル結合の件

    今回以下の内容を mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 sqlに関してあまり理解していません。 table member id name local 1 yamada saga 2 kawasaki osaka 3 tanaka miyagi 4 ozawa aomori table net id watch bag price day 1 2 0 \10,000 12/3 3 1 2 \50,000 12/6 1 0 3 \60,000 12/9 4 1 0 \15,000 12/15 table shop id watch bag price day 3 5 1 \48,000 12/1 3 5 2 \80,000 12/6 1 3 3 \60,000 12/10 3 4 2 \50,000 12/12 1 5 3 \60,000 12/13 結果 id name local net shop 1 yamada saga 2 2 2 kawasaki osaka 0 0 3 tanaka miyagi 1 3 4 ozawa aomori 1 0 という契約にいたった件数を得たいのですがどうすればいいのでしょうか? SELECT a. * , count( b.id ) AS idcount1, count( c.feed_id ) AS idcount2 FROM member AS a LEFT JOIN net AS b ON a.feed_id = b.feed_id LEFT JOIN shop AS c ON a.feed_id = c.feed_id GROUP BY a.feed_id という形でやってみたのですが 片方のカウントがうまく表示できません。 どうすればいいのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • 給与計算で独自の勤怠項目や計算方法を設定できるのか
  • 具体的な例として夜勤手当について紹介
  • フリーウェイジャパン製品・サービスに関する質問
回答を見る