• 締切済み

テーブルの集計値を別テーブルに更新したいのですが

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
  • 回答数5
  • ありがとう数5

みんなの回答

  • nick9090
  • ベストアンサー率26% (102/378)
回答No.5

>PHP側で計算というのは、SQLのテーブルに計算結果を更新せず、ブラウザで計算結果を表示させるのみ。ということでしょうか。 いえいえ、PHPを使って、table1から得意先コードごとの金額を抽出して合計し、table2の「受注金額合計」にその合計額を入れるのです。 「PHPファイルを実行する度に…」と書いていらっしゃいますので、そのPHPファイルの末尾にでも、上記の処理を書いておくだけです。 ごくごくシンプルなことで、何も悩む部分はないと思うのですが・・・?

jcnuser
質問者

お礼

>いえいえ、PHPを使って、table1から得意先コードごとの金額を抽出して合計し、table2の「受注金額合計」にその合計額を入れるのです。 知識不足ですみません。 この方法がわからなかったので質問させていただいたのですが、SQL以外で方法があるのでしょうか。

  • nick9090
  • ベストアンサー率26% (102/378)
回答No.4

計算としては非常に簡単なものですが、それをSQLで書くとちょっとややこしくなるので、その程度ならPHP側で計算したらどうでしょうか。 レコード数にもよりますが、大した負荷ではないと思います。

jcnuser
質問者

お礼

nick9090さん、ご回答ありがとうございます。 PHP側で計算というのは、SQLのテーブルに計算結果を更新せず、ブラウザで計算結果を表示させるのみ。ということでしょうか。

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

あら・・・そうですか、私の手元には3.23系と5.0系の環境しかなく 4.0系の環境がないため検証ができずお役に立てず申し訳ないです。 >SUM(kingaku) as totalの「total」とは何を示すのでしょうか table1のkingakuSUMしたものに別名を付けています。 別名をつけないとそのあとでてくる set total_kingaku=t1.totalのところで指定ができないので 別名は適当な名前で結構です。 ちなみに以下のように2段階でテンポラリをつくれば、3.23系でもできるます。 REPLACEを使うので、table2のIDにUNIQUE属性をつけておく必要があります。 CREATE TEMPORARY TABLE T1 SELECT client_id,sum(kingaku) as kingaku FROM table1 GROUP BY client_id; CREATE TEMPORARY TABLE T2 SELECT ID,client_name,T1.kingaku FROM table2 as t2 INNER JOIN T1 ON ID=client_id; REPLACE table2 SELECT * FROM T2;

jcnuser
質問者

お礼

yambejpさん、わざわざテンポラリ作成のSQLを教えていただき、ありがとうございます。 教えていただいたSQLを実行してみたところ、目的どおりの結果が得られました。 UNIQUE属性やREPLACEなど、これまでに使ったことがない物ばかりでした。 PHPで利用するため、複数のSQLがPHPで利用可能かどうかをこれから調べてみたいと思います。

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

ごめんなさい。途中になっちゃいました こんな感じでどうでしょう? Update table2 left join ( select 得意先コード,sum(受注金額) as total from table1 GROUP BY 得意先コード ) as t1 on t1.得意先コード=table2.ID set 受注金額合計=t1.total

jcnuser
質問者

お礼

ありがとうございます。 折角回答していただきましたが、質問の際と同じエラーが表示されました。 やはりVerの問題でしょうか。 実際に行ったSQLは、「得意先コード」を「client_id」、「受注金額」を「kingaku」として、以下のように修正したものを実行しました。 UPDATE table2 LEFT JOIN (SELECT client_id,SUM(kingaku) as total FROM table1 GROUP BY client_id) as table1 ON table1.client_id=table2.id SET kingaku_total=table1.total それと、気になったのはSUM(kingaku) as totalの「total」とは何を示すのでしょうか。補足をいただけるとありがたいです。

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

別テーブルをつかったupdateはバージョン 4.0.4 以降と書いてありますね。 http://dev.mysql.com/doc/refman/4.1/ja/update.html

jcnuser
質問者

お礼

yambejpさん、早速のお返事ありがとうございます。 4.04以降ですか。そこまで調べませんでした。 まだ調べてないことが多そうです。 レンタルサーバーを利用している以上、複数テーブルを使うUPDATEは不可能ということでしょうか。残念です。 SELECTで表示させることはできたのですけど。 もう少しがんばって他の方法を考えてみます。

関連するQ&A

  • 配列を利用して表示されるテーブルを分けたいです

    PHP・MySQLを独学で利用しています。 以下のtable1のようなテーブルから各値を取り出して表示させたいのですが、特定条件でテーブル表示を分けることができないものか悩んでいます。 table1 ID・得意先コード・受注内容・受注金額・日付 1・   28  ・ xxxx ・ 10000 ・20080701 2・   32  ・ aaaa ・  5000 ・20080704 3・   28  ・ YYYY ・ 20000 ・20080706 4・   15  ・ tttt ・ 15000 ・20080709 5・   32  ・ kkkk ・  3000 ・20080801 (得意先コードはtable2のIDです) table2 ID・得意先名 15・ BBB 28・ CCC 32・ DDD フォームで指定した年月(2008年07月など)を条件に、table2とLEFTJOINした結果を取り出すまではfor文を利用して行うことができました。 得意先コード・受注内容・受注金額・ 日付 ・得意先   15  ・ tttt ・ 15000 ・20080709・BBB   28  ・ xxxx ・ 10000 ・20080701・CCC   28  ・ YYYY ・ 20000 ・20080706・CCC   32  ・ aaaa ・  5000 ・20080704・DDD これを以下のように得意先コードごとにテーブルを分けて表示することは可能なのでしょうか。 得意先コード・受注内容・受注金額・日付   15  ・ tttt ・ 15000 ・20080709 得意先コード・受注内容・受注金額・日付   28  ・ xxxx ・ 10000 ・20080701   28  ・ YYYY ・ 20000 ・20080706 得意先コード・受注内容・受注金額・日付   32  ・ aaaa ・  5000 ・20080704 最終的にはPXDocというソフトを利用して各テーブルのデータを得意先ごとにページ分けして印刷させたいのです。 まずは特定条件でデータを分けることができるかどうかがわからず、質問させていただきました。 お知恵をお借りできるとありがたいです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 集計結果を別テーブルに更新クエリで書き出したい。

    Access2000を使っています。 テーブルとフィールドの関係は次のようになっています。 (一部、Northwind.mdbを使っています。) 受注 ---------------------- 得意先コード 受注コード 受注明細 ---------------------- 受注コード 単価 数量 売上集計 ---------------------- 得意先コード 合計 受注明細テーブルの単価と数量を掛け合わせたものの合計を 売上集計テーブルの合計に書き出したいと思います。 次の選択クエリの合計の値を売上集計テーブルの取引先コード の一致する場所に書き出したいのです。 SELECT 受注.得意先コード, Sum([単価]*[数量]) AS 合計 FROM 受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード GROUP BY 受注.得意先コード; 売上集計テーブルと受注テーブルの得意先コードは同じものが 存在します。 よろしくお願いします。

  • 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つのテーブルでの集計

    こんにちは。 1日悩んでまだ解決出来ないのでちょっと質問に参りました。 以下のような感じのテーブルがあるとして ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 A_id|金額 1111|2000 3333|1000 1111|4000 ● T3 B_id|金額 2222|2000 4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 CCCC|3333|4444|1000 |4000 |5000 テーブル同士はLEFT JOINで繋がっており A_id B_idの合計はそれぞれ SUM()を使って、とりあえず出ている状態です あとはA_id と B_idの合計を出して、5000以上のみ抽出で終わりですが 1.SUM(A_id) とSUM(B_id)の合計方法 2.5000以上の判別方法 をどうするか で試行錯誤しているところです。 PHPで無理矢理 判別させれば表は出せると思うのですが、SQL文(というのでしょうか)の中でどうにかしたいと思っています。 SUMの使い方やHAVING WHERE の使い方・使いどころなどが微妙にわからず うまく応用出来ないので、こういう使い方があるよ・出来るよ といった 参考例があれば教えて頂けますでしょうか。ヨロシクお願いします。 MySQL クライアントのバージョン: 5.0.45

    • ベストアンサー
    • MySQL
  • 2つのテーブルの結合に関してです

    お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2  COUNT ---------------------------------- 1  2/27  2/20  10 2  2/27  2/20  10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1  2/21  2/26  5 2  2/21  2/27  5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • SQLでの集計結果取得について

    以下のようなSQLを書いたのですが,ほしい結果が得られませんでした。 受注に存在しない得意先についても得意先コードと得意先名を得たかったので、 "from 受注 Right Outer Join 得意先 On 受注.得意先コード = 得意先.得意先コード" としたのですが, 受注に存在しない得意先についてはデータが得られませんでした。さらに、Where句で、"受注.得意先コード =* 得意先.得意先コード"と書くとエラーが出てきてしまいました。 どうすれば得意先に存在する得意先すべての集計結果が得られるのでしょうか? String sql = "Select 得意先.得意先コード, Min(得意先.得意先名) " + "As 得意先名, Sum(受注.受注合計金額) " + "from 受注 Inner Join 得意先 " + "On 受注.得意先コード = 得意先.得意先コード " + "where 受注.得意先コード = 得意先.得意先コード " + "and 受注状態区分 = '" + joutaiKubun + "' " +      "and 納入日 between '" + startYMD + "' and '" +        "endYMD + "' " + "Group By 得意先.得意先コード " +      "Order By 得意先.得意先コード ";

    • ベストアンサー
    • Java
  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • 助けて>< 3つのテーブルで簡単な集計

    下記のような3種類のテーブルがあります。 これを集計して、指定したユーザーの指定月のアクセス日時と売上げ金額を表にしたいと思っています。 こんな感じに。 +--+--------+----------+-------+-----+ | id | username| date   | access | sales | +--+--------+----------+-------+-----+ | 1 | admin | 2010-11-13 |   2 | 5000 | | 1 | admin | 2010-11-14 |   2 | 5000 | | 1 | admin | 2010-11-15 |  1 | 20000 | +--+--------+----------+-------+-----+ SELECT u.id AS id, u.username, DATE(a.created_at) AS date, COUNT(*) AS access, SUM(s.amount) AS sales FROM sf_guard_user u INNER JOIN sales s ON u.username = s.user_id LEFT JOIN access_log a ON u.username = a.user_id WHERE (u.username = 'admin' AND a.created_at > '2010-11-01 00:00:00' AND a.created_at < '2010-11-30 23:59:59') GROUP BY date ORDER BY a.created_at; とやってみたのですがダメでした;; ■ユーザー情報テーブル mysql> select id,username from user; +--+---------+ | id | username | +--+---------+ | 1 | admin   | +--+---------+ ■アクセスログテーブル mysql> select * from access_log; +--+-------+--------+------------------+ | id | user_id | ip     | created_at      | +--+-------+--------+------------------+ | 1 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 2 | admin  | 127.0.0.1 | 2010-11-13 21:56:54 | | 3 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 4 | admin  | 127.0.0.1 | 2010-11-14 21:56:54 | | 5 | admin  | 127.0.0.1 | 2010-11-15 21:56:54 | +--+-------+--------+------------------+ ■売上げ金額テーブル mysql> select * from sales; +--+-------+------+------------------+ | id | user_id | amount| created_at      | +--+-------+------+------------------+ | 1 | admin  |  5000 | 2010-11-13 21:56:54 | | 2 | admin  |  5000 | 2010-11-14 21:56:54 | | 3 | admin  |  5000 | 2010-11-15 21:56:54 | | 4 | admin  |  5000 | 2010-11-15 21:56:54 | +--+-------+------+------------------+

    • ベストアンサー
    • MySQL
  • 複数テーブルの数値を別のテーブルに合計したい

    下記の3つのテーブルがあります。 CREATE table money(g_usr_id INT,g_money INT); CREATE table money2(n_usr_id INT,n_money INT); CREATE table money_all(o_usr_id INT,g_money_all INT,n_money_all INT); moneyとmoney2の数値は下記の通りです。 テーブルmoney g_usr_id g_money 1    100 2    200 テーブルmoney2 n_usr_id n_money 1    1000 2     2000 1    10000 2    20000 ユーザー1、ユーザー2の持っている金額の合計をテーブルmoney3に インサートする構文を考えました。 o_usr_id,g_money_all,n_money_all 1    100      11000 2    200      22000 となるのが理想です。 構文 INSERT INTO money_all(o_usr_id,g_money_all,n_money_all) SELECT money2.n_usr_id, SUM(money.g_money), SUM(money2.n_money) FROM `money`,`money2` WHERE money2.n_usr_id = money.g_usr_id; 結果 o_usr_id,g_money_all,n_money_all 1    600      33000 usr_idが最初の1番に纏められ、総合計を表示されます。 しかも、g_moneyに至っては、n_moneyが複数ある関係上、複数回合計されています。 私の希望するユーザーごとの合計を出すにはどこを変更すればよいでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 複数のテーブルをJOINして更新する方法

    複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。