人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで3つ以上のテーブルをLEFT JOINで結合することに関しての質問です。
order item shipの3つのテーブルがあり、
itemの合計価格とshipの合計価格を求めるために以下のようなSQLを発行するとします。
SELECT SUM(item.price), SUM(ship.price) FROM ( order LEFT JOIN item ON order.id = item.orderid ) LEFT JOIN ship ON order.id = ship.orderid WHERE order.id = 1
このときにorder.id = 1に該当するitemとshipのレコードが複数あるときに、
それぞれのレコード数を掛け合わせた分の結果をSUMするため、
合計価格の計算がうまくできないかと思います。
1つのクエリでitemの合計価格とshipの合計価格を求めるにはどのようにしたらいいのでしょうか。

また3つ以上のテーブルをLEFT JOINするときに結合を囲むカッコのあるなしで結果に違いはありますか?

●質問者: shinwa-tokyo
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど
ベストアンサー

SELECT DISTINCT a.*
 , (SELECT sum(b.price) FROM item b WHERE b.id = a.id) AS `数量`
 , (SELECT sum(c.price) FROM ship c WHERE c.id = a.id) AS `価格`
FROM order a
WHERE a.id = 1
;

それぞれの合計だけ欲しい場合の例

SELECT a.id 
 , (SELECT sum(b.price) FROM item b WHERE b.id = a.id) AS `数量`
 , (SELECT sum(c.price) FROM ship c WHERE c.id = a.id) AS `価格`
FROM (SELECT 1 AS id) a
;


括弧の有無についてですが、
今件の場合は先に記述したものから順に処理されますので括弧に意味は無いです


shinwa-tokyoさんのコメント
ご回答ありがとうございます。とても勉強になります。 そもそも上記のケースで結合の必要はなかったのですね…。 教えていただいた方法で試したところ正しく計算できました。 結合としか考えていなかったため目から鱗です。 今回の場合はご教授頂いた方法がベストだと思いますが、 考え方を整理するために、もしよろしければ、 以下のことを教えていただけたら幸いです。 テーブルが2つのときは私が出した例のようにLEFT JOINで結合しても合計を正しく計算できると思います。 3つ以上の場合は結合をして合計を求めるのは不可能なのでしょうか?

うぃんどさんのコメント
>3つ以上の場合は結合をして合計を求めるのは不可能なのでしょうか? 下記のような具合に先に集計しておくという手もありますけど、 面倒(=記述ミスしやすい=メンテナンスも面倒)なので、 例としては採用しませんでした >|sql| SELECT a.*, b.数量, c.価格 FROM (SELECT * FROM order WHERE id = 1 GROUP BY id) a LEFT JOIN (SELECT b.id, sum(b.price) AS `数量` FROM item b GROUP BY b.id) b ON b.id = a.id LEFT JOIN (SELECT c.id, sum(c.price) AS `価格` FROM ship c GROUP BY c.id) c ON c.id = a.id ; ||< 例としてあげた2つ目は、 オーダーテーブルを使わないというちょっとユニークな手をあげておいたのですが、 PREPAREしたりプログラムでSQLを生成したりするならば、もっと簡単ですよね・・・ >|sql| SELECT 1 AS id , (SELECT sum(b.price) FROM item b WHERE b.id = 1) AS `数量` , (SELECT sum(c.price) FROM ship c WHERE c.id = 1) AS `価格` ; ||< SQLパズルという言葉があるほどにSQLの書き方は様々で、まだまだあります いろいろなパターンを覚えて、 それぞれのテーブルに格納されているデータの状況にあわせた最適な方法を選べるようになるといいですね

shinwa-tokyoさんのコメント
お返事頂きありがとうございます。 「SQLパズルという言葉」は本当にその通りですね。 色々な書き方があり、それによって計算方法やスピードが 変わってくることがよく理解できました。 教えていただいた例、とても参考になりました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ