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するときに結合を囲むカッコのあるなしで結果に違いはありますか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/25 15:50:13

ベストアンサー

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

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
;

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

他1件のコメントを見る
id:windofjuly

>3つ以上の場合は結合をして合計を求めるのは不可能なのでしょうか?

下記のような具合に先に集計しておくという手もありますけど、
面倒(=記述ミスしやすい=メンテナンスも面倒)なので、
例としては採用しませんでした

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を生成したりするならば、もっと簡単ですよね・・・

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の書き方は様々で、まだまだあります
いろいろなパターンを覚えて、
それぞれのテーブルに格納されているデータの状況にあわせた最適な方法を選べるようになるといいですね

2011/11/24 11:22:46
id:shinwa-tokyo

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

2011/11/25 15:49:59

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません