複数テーブル検索で同idの部分は結合させたい

このQ&Aのポイント
  • 初心者です。tableA, tableB, tableCのidを軸にデータを表示したいが、tableDのiconsの内容も出力したいが、行ごとにレコードが分かれてしまう。ひとつのカラムにiconsをカンマ区切りで結合したい。
  • tableA, tableB, tableCのidを軸にデータを表示する方法はわかるが、tableDのiconsを結合する方法がわからない。
  • MySQL 5.0.90-logを使用して、tableA, tableB, tableCのidを軸にデータを表示したいが、tableDのiconsをカンマ区切りで結合したいが方法がわからない。
回答を見る
  • ベストアンサー

複数テーブル検索で同idの部分は結合させたい

初心者です。 ちょっと伝えずらいのですが、 下記のようなテーブル構造になっています。 ■tableA +----+-------------------+------------------------------------------+ | id | title | body | +----+-------------------+------------------------------------------+ | 1 | test1 | aaaaaaaaaa | | 2 | test2 | bbbbbbbbbbbb | +----+-------------------+------------------------------------------+ ■tableB +----+-------------------+------------------------------------------+ | id | name | sex | +----+-------------------+------------------------------------------+ | 1 | taro | men | | 2 | yoko | women | +----+-------------------+------------------------------------------+ ■tableC +----+-------------------+------------------------------------------+ | id | num | order_id | +----+-------------------+------------------------------------------+ | 1 | 33 | 1 | | 2 | 66 | 2 | +----+-------------------+------------------------------------------+ ■tableD +-------------------+------------------------------------------+ | icons | order_id | .+-------------------+------------------------------------------+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 5 | 1 | | 1 | 2 | | 3 | 2 | +-------------------+------------------------------------------+ tableA,B,Cのidを軸にデータを表示したいのですが、 --------------------------------------------------------- tableA.id , body , name , sex , num , order_id FROM tableA , tableB , tableC WHERE tableA.id = tableB.id AND tableA.id = tableC.id ---------------------------------------------------------- で出力できました。 で、tableDのiconsの内容も出力したいのですが、 --------------------------------------------------------- tableA.id , body , name , sex , num , order_id , icons FROM tableA , tableB , tableC WHERE tableA.id = tableB.id AND tableA.id = tableC.id AND tableC.order_id = tableD.order_id ---------------------------------------------------------- でやると、2行しかデータがでないはずなのですが、 6行出力されてしまいます。 たぶん、tableDのデータの持ち方が、 ひとつのidに複数のiconsがある場合は、 行ごとにレコードを分けているためだと思いますが・・・ tableDの行分、6行でているのです。。 なので、期待する結果は、 ちゃんとidの数分だけ出力されて、 同order_idにiconsが複数ある場合は、 行ごとに分かれるのではなく、 ひとつのカラム?にカンマ区切りなどで 入れたいのですがどうしたらよいでしょうか?? ↓期待する結果 ----------------------------------------------------------------------- +----+-------------------+------------------------------------------+ | id | title | body | order_id | icons +----+-------------------+------------------------------------------+ | 1 | test1 | aaaaaaaaaa | 1 |1,2,3,5 | 2 | test2 | bbbbbbbbbbbb | 2 | 1,3 +----+-------------------+------------------------------------------+ ※カンマじゃなくてもいいです わかりづらくて申し訳ありませんが、 ご教授お願いいたします。 MySQL 5.0.90-log ちなみにec-cubeの高度な設定の csvを吐き出す部分で使用しています。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

group_concatを使ってみてください select tableA.id , body , name , sex , num , tableC.order_id , group_concat(icons order by icons) as icons FROM tableA , tableB , tableC ,tableD WHERE tableA.id = tableB.id AND tableA.id = tableC.id AND tableC.order_id = tableD.order_id group by tableA.id , body , name , sex , num , tableC.order_id

trfnc223
質問者

お礼

ありがとうございます! 実は、実際は、カラムがものすごい量があって、 group by tableA.id , body , name , sex , num , tableC.order_id の部分は全部入れないといけないものなのでしょうか?? ただだいぶいいところまで来ました!!

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

解決しているみたいですが create index idx_order_id on tableD ( order_id, icons ); で索引つくって select tableA.id , tableA.body , tableB.name , tableB.sex , tableC.num , tableC.order_id, group_concat(tableD.icons order by icons) FROM tableA inner join tableB on tableA.id = tableB.id inner join tableC on tableA.id = tableC.id inner join tableD on tableC.order_id=tableD.order_id group by tableD.order_id; 実行計画を比較してみてください。

trfnc223
質問者

お礼

ありがとうございます!

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ごめんなさい、手を抜きすぎた。 こんな感じでどうですか? select tableA.id , body , name , sex , num , tableC.order_id ,icons FROM tableA , tableB , tableC , (SELECT order_id, group_concat(icons order by icons) as icons FROM tableD group by order_id) AS D WHERE tableA.id = tableB.id AND tableA.id = tableC.id AND tableC.order_id = D.order_id

trfnc223
質問者

お礼

どちらもできるんですね! ありがとうございます!!

trfnc223
質問者

補足

すいません、、、 : Unknown column 'order_id' in 'field list'] というエラーが出てしまいました。。。 ためしに、tableAをつけてみたんですが、 : Unknown column 'tableA.order_id' in 'field list'] となってしまいました。。。

関連するQ&A

  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • SQLでテーブルを結合した結果を取り出し

    SQLで以下の様なテーブルがあります。 tableA、tableB、tableCを使って、IDとNUMとRANKを結合し、 ID毎に、 RANKが1つでもあったら、”○”でその数を RANKが1つもなかったら、”×”で0を 取り出したい。 「oracle10g」です。 -- tableA ID,NUM,NAME,・・・・・ 000001,001, 000001,002, 000001,003, 000002,001, 000003,001, 000003,002, -- tableB ID,NUM,RANK 000001,001,A 000001,001,B 000001,001,C 000001,002,A 000001,003,C 000002,001,B 000002,002,B 000003,001,A 000003,002,A 000003,002,C --tableC RANK,NAME A, B, C, 結果として、 ID,RANK,判定,個数 000001,A,○,2 000001,B,○,1 000001,C,○,2 000002,A,×,0 000002,B,○,2 000003,A,○,2 000003,B,×,0 000003,C,○,1 を得たいです。 どのようなSQLにしたらよいか、よろしくお願いします。

  • 複数表での集計値について

    以下のようなテーブル構造。SQLで 集計値を求めたいのですがCNTの値が tableCの件数を取得してしまいます。 (取得したいのはtableA.ID毎のtableB.ID2の件数) 宜しくお願いします。 ・tableA ------------- ID ------------- ・tableB ------------- ID | ID2 ------------- ・tableC ------------- ID2 | TIME ------------- SELECT tableA.ID ,SUM(tableC.TIME) AS TIME ,COUNT(tableB.ID2) AS CNT FROM tableA,tableB,tableC WHERE tableA.ID = tableB.ID AND tableB.ID2 = tableC.ID2 GROUP BY tableA.ID

    • ベストアンサー
    • MySQL
  • 2つのテーブルを結合する際にIDを割り当てたい

    PHPでmySQLを作成しています。 現在学習中なのですが、自己解決できない問題が発生したのでどうかお知恵をお貸しください。 --- 同じデータベースにTableAとTableBがあります。 中身は下記のようだとします。 TableA      |  TableB id  name time | name time :   :   :  |  C1   D2 101 A1  B1  |  C2   D2    102 A2  B2  |   :    : 103 A3  B3  |  C20  C20 --- テーブルAのカラムid、name、timeの3カラム、テーブルBはname、timeの2カラムです。 これを --- TableA        TableB id  name time  name time :   :   : 101 A1  B1 102 A2  B2 103 A3  B3 104 C1  D1 105 C2  D2 :   :   : 123 C20  D20 --- とするような方法を教えてください。(TableBはレコードなし) テーブルの結合ではIDが割り当てられず、上手な方法が思いつきません。 どうかご教示のほど、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • 複数テーブルからのデータ取得

    MySQLで 4つのテーブルからデータを取得する方法を教えてください。 4つのテーブルの構造は全く同じです。 構造的には id・・・int name・・・varcher(30) point・・・int start・・・datetime end・・・datetime tableA,tableB,tableC,tableDの4つのテーブルからpointのデータを昇順に取得したいです。 よろしくお願いします。

  • 2つのテーブルの連動

    MySQL3を使っています。 [tableA] ID |NUM ------- abc|1 def|2 ghi|3 [tableB] ID |TEXT ------- def|あいうえお abc|かきくけこ def|さしすせそ のような2つのテーブルがあって、[tableB]のデータを[tableA]のNUM列の番号順に、出力するにはどうすればいいのでしょうか? 上の例で行くと、 abc|かきくけこ def|あいうえお def|さしすせそ こんな感じの並びにしたいのです。

    • ベストアンサー
    • MySQL
  • Access SQL 全てのレコードを出力

    こんばんは。 SQL初心者です。 SQLを作成していたのですが、なかなか上手く行かずに頭がこんがらがってきてしまいました。 どなたかご教授お願いできないでしょうか? 例えば、8/22の入出金状況がTableA,TableBの様な状況だとするとTableCを出力するにはどのようなSQLを書けば良いのでしょうか? TableA [銀 行],[入 金] UFJ,5000 MIZUHO,4000 RISONA,2500 SINSEI,3000 TableB [銀 行],[出 金] UFJ,3000 MIZUHO,1500 RISONA,1000 AIWA,6000 ↓ TableC [銀 行],[入 金],[出 金] UFJ,5000,3000 MIZUHO,4000,1500 RISONA,2500,1000 SINSEI,3000,0 AIWA,0,6000 基本的なSQLなのかもしれないですが、よろしくお願いいたします。 WindowsXP,Access2000の環境です。

  • SQL 複数テーブルのupdate

    こんばんは。 複数テーブルの複数カラムをupdateしたいのですが、 うまくいかず困っています。 どなたか助けてください>_< テーブルA(tableA)のoptionAというカラムと、 テーブルB(tableB)のoptionBというカラムを両方更新したいんです。 やりたい内容のイメージとしてはこんな感じです↓ update tableA a, tableB b set a.optionA='OK', b.optionB='OK' where a.student_id=b.student_id and a.name='山田'; どなたかご指導お願いいたします。

  • SQLiteのUPDATE文を教えてください。

    UPDATE tableA, tableB SET tableA.name = tableB.name WHERE tableA.id = tableB.id; 上記のSQLが他のデータベースでは動きますが、SQLiteでは動きません。 同意味のSQLはどう書くのでしょうか。お願いします。