【MySQL&PHP初心者向け】4つのテーブルを結合して集計する方法

このQ&Aのポイント
  • MySQL&PHP初心者向けの集計方法をご紹介します。テーブル1はIDと会社名、テーブル2はIDと受注内容と受注金額、テーブル3はIDと経費、テーブル4はIDと仕入を持っています。これら4つのテーブルを結合し、必要なデータを取得する方法を解説します。
  • 具体的には、ID・会社名・受注内容・経費・仕入を取得したいとします。しかし、結果が期待通りにならず、経費の部分が『400』となってしまう問題が発生しています。解決策をご紹介します。
  • 解決策としては、JOIN文を使用して4つのテーブルを結合し、結果を集計する方法があります。また、CASE文を使用して条件に応じた集計結果を取得することも可能です。詳細なコード例も提供しますので、参考にしてみてください。
回答を見る
  • ベストアンサー

4つのテーブルを結合して集計したいです。

mysql&php初心者です。 考えて4日目になりますがどうしても出来ないので宜しくお願いします。 現在使っているのは MYSQL4.1でレンタルサーバーです。 そしてCREATE TEMPORARY・CREATE VIEWは使用できないみたいです。 そしてやりたいことは4つのテーブルを結合して集計したいです。 具体的には テーブル1 ID・会社名の順に 35・テスト会社 テーブル2 ID・受注内容・受注金額 35・テスト受注・100000 テーブル3 ID・経 費 35・200 テーブル4 ID・仕 入 35・200 35・500 の4つです。 で希望の結果は ID・会社名・受注内容・経費・仕入 35・テスト会社・テスト受注・200・700 と出したいのですがどうしても経費の部分が『400』となってしまいます。 無理なことをしようとしているのかも知れませんが宜しくお願いします

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

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

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

#1です。 #1提示のSQLは、group byは必要なかったですね。 <訂正版SQL例> select x.id, 会社名, 受注内容, (select sum(経費) from tbl3 where id=x.id) as 経費, (select sum(仕入) from tbl4 where id=x.id) as 仕入 from tbl1 as x,tbl2 where x.id=tbl2.id

taabooo
質問者

お礼

chukenkenkou様 ご丁寧にありがとう御座います。 レンタルサーバーでCREATE TEMPORARY TABLEは禁止されているみたいでした。 でもSELECTとFROMの間にSQLを書けるとは、考えもしなかったです。 本当に勉強になりました。 ありがとう御座いました。

その他の回答 (1)

回答No.1

各表の行数の比率を示してくれると、回答しやすいのですけどね。 テーブル4のID=35の行が2行あるので、単純にジョインするとテーブル3の経費=200の行が2個できてしまいます。 <SQL例> select x.id, 会社名, 受注内容, (select sum(経費) as 経費 from tbl3 where id=x.id group by id) as 経費, (select sum(仕入) as 仕入 from tbl4 where id=x.id group by id) as 仕入 from tbl1 as x,tbl2 where x.id=tbl2.id >MYSQL4.1でレンタルサーバーです。 >そしてCREATE TEMPORARY・CREATE VIEWは使用できないみたいです create viewは、MySQL 5.0で実装されたので、使えなくて当然でしょう。cerate temporary tableはMySQL 4.0以前の実装なので、create tableができるなら、使えると思いますが?

関連するQ&A

  • MySQL 可変テーブルの集計方法

    今現在、PHP MySQLにてDB&簡単なCMSを作成中です。 仕入テーブル(id, date_y, date_m, id_cost, price, etc...)と勘定項目テーブル(id_cost, name_cost)をid_costをキーにして連結し、月々の勘定項目ごとの集計画面を作成したいのです。 SELECT 仕入テーブル.date_y, 仕入テーブル.date_m, 仕入テーブル.id_direct_cost, 勘定項目テーブル.name_cost, SUM(仕入テーブル.price) AS sumcost FROM 仕入テーブル NATURAL JOIN 勘定項目テーブル WHERE 仕入テーブル.date_y="'.$y.'" AND 仕入テーブル.date_m="'.$m.'" AND 仕入テーブル.typecost="direct" AND 仕入テーブル.id_direct_cost=勘定項目テーブル.id_cost ※$y, $mは集計画面で選択された年月です。 とすると、月々の合計が抽出され、勘定項目ごとの集計ができません。 当方、半年くらい学校にてPHP MySQLを習ったのですが、まだまだ未熟者のため解決できません。 お力をお貸しいただけますと大変ありがたく存じます。 どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • テーブル結合

    度々お世話になっています。 Mysqlのテーブル結合したいと思ってます。 テーブル構成は以下のとおりですのでご参照ください。 ■テーブルA id | name 1 | bind 2 | samba 3 | apache ■テーブルB id | detail 3 | test 3 | test 1 | test ■結合結果 id | count 1 | 1 2 | 0 3 | 2 テーブルA,Bはidコラムで紐づいています。 この際、テーブルBのidごとにレコード数を出力したいのですが、 どういったSQLを流せば良いでしょうか。 ご教示願います。

    • ベストアンサー
    • MySQL
  • テーブルを結合するとき

    MySQLのSQL文です。 TblAのID、Nmがあり、TblBにID、Adrsがあるとします。 次の2つのSQL文の結果は同じになります。 そもそもこの2つの書き方には何か違う意味があるのでしょうか。 CREATE View TblC1 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA INNER JOIN TblB ON TblA.ID = TblB.ID; CREATE View TblC2 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA ,TblB where TblA.ID = TblB.ID; また、TblAにはありTblBには含まれないレコードを出すときは CREATE View TblC3 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA LEFT JOIN TblB ON TblA.ID = TblB.ID; 逆にTblBにありTblAには含まれないレコードを出すときは CREATE View TblC4 as SELECT TblA.ID, TblA.Nm, TblB.Adrs FROM TblA RIGHT JOIN TblB ON TblA.ID = TblB.ID; としています。 これをwhereを使った書き方ではできないのでしょうか。

    • ベストアンサー
    • MySQL
  • 3.23.59でのテンポラリテーブルの削除、補完機能について

    お世話になります。 server version: 3.23.59-nightly-20050301 上記バージョンのMySQL使ってシェルのコマンドプロンプトから mysql>CREATE TEMPORARY TABLE `test` (`name` VARCHAR( 255 ) NOT NULL); とテンポラリテーブルを作って mysql>DROP TEMPORARY TABLE test; そのテーブルを削除しようとすると ERROR 1064: syntax error near 'TEMPORARY TABLE test' at line 1 とエラーがでます。 これは仕様なのでしょうか? しかたがないのでいったん接続を閉じてテンポラリテーブルを消してますが server version: 4.0.18 で同じことを行うと正常に削除できます。 また、 server version: 3.23.59-nightly-20050301 だとselectと入力しようとして mysql>sele(タブキー) とやると補完されますが server version: 4.0.18以上だと だと補完されません。(フィールド名は補完できました) なにか設定などが必要なのでしょうか? よろしくお願いします。

  • テーブルにはったインデックスは、ビューに対しても効力があるのか

    環境:RedHat Linux AS3.0 / PostgresSQL 7.3.6 Publicスキーマにインデックス付きのテーブルを作成し、 複数のスキーマにビューを作成してそのテーブルをそのまま参照したいと思っています。 (スキーマの数が非常に多いので、実体をひとつにし、  ディスク容量を抑えるのが目的です。) 環境のイメージは以下の通りです。 ◆Publicスキーマにテーブル作成------- create table TEST_TABLE ( id int, data varchar ); ◆test_tableにインデックスを作成------- create unique index TEST_KEY on TEST_TABLE ( id ); ◆test_schemaスキーマを作成------- create schema TEST_SCHEMA; ◆test_schemaスキーマにビューを作成------- create view TEST_SCHEMA.TEST_VIEW as select id, data from TEST_TABLE ; このような環境にて「TEST_VIEW」にSELECTをかけた場合、 「TEST_KEY」は踏襲されるのでしょうか? ビューに対してインデックスは作成できないようなので、 テーブルに対してはられたインデックスはビューでも生きている のではないかと考えたのですが、 上記認識で合っているかどうか ご存知の方がいらっしゃいましたらご教授頂けると助かります。 宜しくお願い申し上げます。

  • JDBCでテンポラリテーブルを扱う

    JDBCを使って、テンポラリテーブル(DBはMySQL)を作成したのですが、CREATE文を発行したクラス内では、INSERT,SELECTできるのですが、別クラス(別画面から別業務クラス)で、テンポラリテーブルにアクセスしようとすると、 テーブル名 doesn't exist というエラーが出てアクセスできません。 どこに原因があると考えられるでしょうか?

    • ベストアンサー
    • Java
  • アクセス2003 集計『最後』

    いつもお世話になっています。 <仕入記録テーブル>で商品Aを下記のように複数回入力してあります。(数字がズレてたらすいません。) | 仕入ID | 仕入年月日 | 商品名 | 数量 | 単価 |    76    2006/4/26       A      5     108    78    2006/4/28       A      5     108   253    2006/7/20       A     10     108   815    2006/11/10       A     10     120   843    2007/1/11       A      5     108   852    2007/1/12       A      2     120  1001    2007/2/19       A     10     120 クエリで<仕入記録テーブル>から各商品の最も最近の仕入単価を取り出したいと思い、デザインビューで<仕入記録テーブル>から<単価フィールド>を選択し集計方法を『最後』に設定しました。 すると表示された金額がなぜか108円になってしまいました。 やり方がおかしいのかと思いDLast関数というのも試してみたのですが、構文がイマイチ理解できずうまくいきませんでした。 仕入記録から仕入年月日の最も新しい仕入単価を出すにはどうしたらよいのでしょうか? よろしくお願いします。 

  • テーブルの結合について

    野球のスコア表を付けようと考えています。 scoreというテーブルにスコアを、 teamというテーブルにチーム名(team_idとteam_name)を入れています。 scoreテーブルには一行でホームチームのidとスコア、ビジターチームのidとスコアを入れています。 そして、そのidとteamテーブルにあるidとを結合しています。 しかし、PHPで読み込む際に(おそらく行の先頭に近いからという理由で)ビジターチームだけを読み込んでしまい、たとえば「横浜対横浜」のような形になってしまいます。 PHPでもう一回ホームチームだけを読み込むようにプログラムすれば問題なく表示はできるのですが、効率が悪いように感じます。 そこで、一回でホームチームとビジターチームの両方を読み込む方法をご教示賜りたく質問させていただきました。 テーブルの構造が悪いと思うのでMySQLの方に投稿させていただきましたが、PHPで可能であればそちらでもかまいません。 よろしくお願いします。 Apache 1.3.34 PHP 4.3.11 MySQL 4.0.26

    • ベストアンサー
    • MySQL
  • access 1対1と1対多のテーブルをクエリで集計したい…

    受注管理のデータベースを作っています。 売り上げを計算するクエリを作ったのですがどうもうまくいかないので質問します。 集計したいテーブルですが 受注マスタテーブル 注文番号(主キー テキスト型) 注文日(日付型) 氏名 : : 受注明細マスタテーブル 注文番号 (重複あり)受注マスタの注文番号と1対多のリレーションシップ 商品名 品番 販売単価 購入個数 経費・返品金額テーブル 注文番号(主キー)受注マスタの注文番号と1対1のリレーションシップ 経費 返品金額 これを、販売単価×購入個数-経費+返品金額というようにして1ヵ月ごとに集計しようとして、下のようなクエリを作ったのですが経費が何回も計算されてうまくいきませんでした… よろしくお願いします。 SELECT Format(注文者マスタ!注文日,"yyyy/mm") AS 月, Sum([受注明細マスタ]![販売単価]*[受注明細マスタ]![購入数量]-[経費・返品金額テーブル]![経費]+[経費・返品金額テーブル]![返品金額]) AS 売上 FROM (注文者マスタ RIGHT JOIN 経費・返品金額テーブル ON 注文者マスタ.注文番号 = 経費・返品金額テーブル.注文番号) LEFT JOIN 受注明細マスタ ON 注文者マスタ.注文番号 = 受注明細マスタ.注文番号 GROUP BY Format(注文者マスタ!注文日,"yyyy/mm");