複数テーブル検索で同idの部分は結合させたい
- 初心者です。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を吐き出す部分で使用しています。
- trfnc223
- お礼率63% (111/174)
- MySQL
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
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
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
解決しているみたいですが 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; 実行計画を比較してみてください。
お礼
ありがとうございます!
- yambejp
- ベストアンサー率51% (3827/7415)
ごめんなさい、手を抜きすぎた。 こんな感じでどうですか? 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
お礼
どちらもできるんですね! ありがとうございます!!
補足
すいません、、、 : 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; ----------------------------------------------------------------------------------------------------
- 締切済み
- MySQL
- 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にしたらよいか、よろしくお願いします。
- ベストアンサー
- Oracle
- 複数表での集計値について
以下のようなテーブル構造。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のデータを昇順に取得したいです。 よろしくお願いします。
- 締切済み
- MySQL
- 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の環境です。
- ベストアンサー
- Visual Basic
- 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='山田'; どなたかご指導お願いいたします。
- ベストアンサー
- Oracle
- SQLiteのUPDATE文を教えてください。
UPDATE tableA, tableB SET tableA.name = tableB.name WHERE tableA.id = tableB.id; 上記のSQLが他のデータベースでは動きますが、SQLiteでは動きません。 同意味のSQLはどう書くのでしょうか。お願いします。
- ベストアンサー
- その他(データベース)
お礼
ありがとうございます! 実は、実際は、カラムがものすごい量があって、 group by tableA.id , body , name , sex , num , tableC.order_id の部分は全部入れないといけないものなのでしょうか?? ただだいぶいいところまで来ました!!