• 締切済み

SUMとJOINのことで質問です

こんにちは 以下のようなテーブルがあるとして これらをLEFT JOINで全て繋いで、T2以降のSUM(金額)をそれぞれ 取りたいのですが、T2 T3 T4 T5 T6 の中にデータを入れるごとに 2倍・4倍・8倍・16倍とSUMの中の値がドンドン増えていってしまう のですが、何が原因なのでしょうか? 増えていく値が2のn乗なのはわかるのですが、どこが引っかかって こんなことになるのかサッパリわかりません。 ● T1 名前|A_id|B_id|C_id|D_id|E_id| AAAA|1111|2222|3333|4444|5555| ● T2 id|S_id|金額 01|1111|1000 →SUM=1000のはずが、16000 ● T3 id|S_id|金額 01|2222|2000 →SUM=2000のはずが、32000 ● T4 id|S_id|金額 01|3333|3000 →SUM=3000のはずが、48000 ● T5 id|S_id|金額 01|4444|4000 →SUM=4000のはずが、64000 ● T6 id|S_id|金額 01|5555|5000 →SUM=5000のはずが、80000 原因と宜しければ修正方法も教えて頂けるとありがたいです。 MySQL クライアントのバージョン: 5.0.45です 宜しくお願いします。。。

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

みんなの回答

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

情報が不十分なのでなんとも言えません。 原因はJOINの使い方を(もしくはSQLの仕様を?)曲解しているからと しかいいようがありません。 T2~T6はいくつもデータを持つですよね? それをLEFT JOINすれば行数に応じたデータができるので それをsumすればSQLの動作としてはたぶん仕様どおりに 動いていると思います。 具体的なSQLと、T1~T6のデータを複数レコードになった状態で 例示した方がよいですね。各テーブルが単一レコードでは おこらない現象でしょうしねぇ 結果的にはテーブルの構造からいじらないとどうしょうもない かなぁ・・・とは思っていますが。

koke29
質問者

お礼

yambejpさん 早速の回答ありがとうございます この間まで、3つのテーブルでSUMを取る分には全然OKだったんですよ それが6つに増えた途端にほぼ同じSQL文でもこんな現象になってしまって…すごくシンプルな抽出を行っても、状態が変わらないんです 実際のSQL文を例のテーブルに合わせて書き換えて例示してみます。 ※条件などは若干 端折りますが結果は同じです。 SELECT 名前, T1.A_id, sum(IF(T2.金額 > 0,T2.金額,0)) as T2金額, T1.B_id, sum(IF(T3.金額 > 0,T3.金額,0)) as T3金額, {以下、T6までほぼ同じ文なので略} GROUP_CONCAT(T2.id), GROUP_CONCAT(T3.id) {以下、T6までほぼ同じ文なので略} FROM T1 LEFT JOIN T2 ON T1.A_id = T2.S_id LEFT JOIN T3 ON T1.B_id = T3.S_id {以下、T6までほぼ同じ文なので略} group by T1.A_id,T2.B_id… HAVING T2金額 >= 規定の金額 or T3金額>= 規定の金額 {以下、T6までほぼ同じ文なので略} 今のところ、テーブル内のデータは質問文に書いたのとほぼ同じ状態でテストしてます。(T2~T6は金額や件数が少し違います) 3テーブルで正常に動作していた時とほとんど変わりがないので SQL文自体には問題ないんじゃないかなぁと思うのですが、どうでしょう? テーブルの作り方にも問題ありそうなので、ちょっと検証してみます。 質問すること・回答を読むことで状況の整理が出来たので、とりあえず 問題のひとつひとつを検証しながら原因を追求してみます!!

koke29
質問者

補足

サブクエリを使ってJOINすることで解決出来ました! http://oshiete.homes.jp/qa3605347.html ↑これを読んで、原因が何かよくわかりました どういう順番で実行されていくのかも把握していないと 正しいSQL文は書けないんですね 勉強になりました

関連するQ&A

  • 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
  • SUMの使い方

    こんにちは。 SUMの使い方で教えて欲しいことがあるのです。 SELECT句の中でSUMの入れ子は使えないのでしょうか。 SUM(IF(SUM(金額) >= 5000,金額,0)) という感じで SUM(金額)が5000以上の条件で真:SUM(金額)偽:0 という結果を求めたいのですが、動かないのでこれじゃダメなんだなと 思い色々試してはみたのですが、欲しい結果が出せません。 何かよい方法を知っている方がいましたら、教えて下さい… MySQL クライアントのバージョン: 5.0.45 です

    • ベストアンサー
    • MySQL
  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • mysqlでJOIN文

    関係有りそうな部分だけ抜粋します。 mysqlで外部キーを設定して、 下記のようなSQLを実行してみましたが、 #1066 - Not unique table/alias: 'tie_up'と エラーメッセージが表示されました。 何がおかしいのでしょうか? 外部キーは「song」テーブルの「tie_up_1_ID」、同「song」テーブルの「tie_up_2_ID」、 それと「tie_up」テーブルの「tie_up」です。 SQLを触るの5年振りなんで・・・。 SELECT * FROM ((((( song left JOIN kashu ON song.kashu_ID = kashu.kashu_ID) left JOIN sakushi ON song.sakushi_ID = sakushi.sakushi_ID) left JOIN sakkyoku ON song.sakkyoku_ID = sakkyoku.sakkyoku_ID) left JOIN hennkyoku ON song.hennkyoku_ID = hennkyoku.hennkyoku_ID) left JOIN tie_up ON song.tie_up_1_ID = tie_up.tie_up_ID) left JOIN tie_up ON song.tie_up_2_ID = tie_up.tie_up_ID;

    • ベストアンサー
    • MySQL
  • 2つのテーブルでの集計2

    昨日解決したかと思ったのですが、また出来ないことが出てきたので 同じようなタイトルで再度質問に参りました。 以下のようなテーブルがあるとして、 ● T1 名前|A_id|B_id| AAAA|1111|----| BBBB|----|2222| CCCC|3333|4444| ● T2 id|A_id|金額 01|1111|2000 02|3333|1000 03|1111|4000 ● T3 id|B_id|金額 01|2222|2000 02|4444|4000 ● 抽出結果でやりたいこと →SUM(A_idの金額)とSUM(B_idの金額)を足した金額が5000以上のみ抽出 かつ、T2とT3のid(通し番号)はグループ化せずに個々で出す 名前|A_id|B_id|A金額|B金額|横の合計| AAAA|1111|----|6000 |-----|6000 idはT2:01/03 CCCC|3333|4444|1000 |4000 |5000 idはT2:02/T3:02 表の作成はOKなのですが、個々のデータのidがグループ化してしまって どのデータから参照しているのかわからない状態になってしまいます 抽出結果に応じたidのデータに出力された日付を書き込みたいのですが、 今の状態ですと1つ分にしか書き込みされません… 全く同じ条件下でT2、T3個々のデータのidを全件取り出すことは可能でしょうか??アドバイス宜しくお願いします。。。 MySQL クライアントのバージョン: 5.0.45

    • ベストアンサー
    • MySQL
  • ~JOIN ON句でこのような問い合わせはできるのでしょうか?

    SELECT * FROM `テーブル1` AS t1 LEFT JOIN `テーブル2` AS t2 ON ( ( t1.a * 100000 ) + t1.b ) = t2.a エラーはでませんが、意図したレコードが返ってきません。クエリの使い方が間違っているのでしょうか?教えてください。 検証環境:MySQL 4.0.24-standard

    • ベストアンサー
    • MySQL
  • LEFT JOIN とRIGHT JOINの合体版のような結合方法。

    LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value  id ------------------- ああ   3 いい   4 うう     5 table : test2 value  id -------------------- AAA   1 BBB   2 CCC   3 DDD   4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ   3     CCC   3 いい   4     DDD   4 うう    5    NULL   NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL  NULL  AAA   1 NULL  NULL  BBB   2 ああ   3     CCC   3 いい   4     DDD   4 以上、ご教示お願い致します。

    • ベストアンサー
    • MySQL
  • 少し複雑な left join

    まだデーターベースを独学で始めて数ヶ月の初心者です。 以下(3行目のleft join)の記述では動かないのですが、どのように 記述したらよいのでしょうか? やりたい内容は3行目にあるようにbookedというテーブルの中のdateが 2013-06-05だけ抽出した形のテーブルを、timeTplというテーブルとleft join させたいです。 1 "select * 2 from 3 timeTpl as t left join (SELECT * FROM booked where date ="2013-06-05") as b 4 on 5 t.start >= b.startTime and t.start < b.finishTime || 6 t.finish > b.startTime and t.finish <= b.finishTime 7 where 8 t.time > 9 (select start 10 from class as c left join member as m 11 on c.className = m.class 12 where m.name = '$name') 13 ) 14 "; よろしくお願いします。

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • LEFT JOINの使い方

    linkテーブルとcommentテーブルがあります。 下記のようなSQLをPHPから発行すると、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from comment AS c LEFT JOIN link AS l ON c.pid=l.id order by c.id desc LIMIT 0, 10; $rec['cid'] や $rec['cname'] にはデータがあるのですが $rec['id'] や $rec['url'] にはデータが入っておらずNULLになってしまいます。 ためしに LEFT JOINの左右を下記のように入れ替えみたところ、 select c.id AS cid, c.pid AS cpid, c.name AS cname, l.id AS id, l.url AS url from link AS l JOIN comment AS c LEFT ON c.pid=l.id order by c.id desc LIMIT 0, 10; 今度は $rec['id'] や $rec['url'] にはデータがあるのですが $rec['cid'] や $rec['cname'] にはデータが入っておらずNULLになってしまいました。 どこがおかしいのでしょうか? MYSQLは5.1.22-rcでレンタルサーバーはcoreserverを利用しています。

    • ベストアンサー
    • MySQL