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するときに結合を囲むカッコのあるなしで結果に違いはありますか?
例
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 ;
括弧の有無についてですが、
今件の場合は先に記述したものから順に処理されますので括弧に意味は無いです
>3つ以上の場合は結合をして合計を求めるのは不可能なのでしょうか?
下記のような具合に先に集計しておくという手もありますけど、
面倒(=記述ミスしやすい=メンテナンスも面倒)なので、
例としては採用しませんでした
例としてあげた2つ目は、
オーダーテーブルを使わないというちょっとユニークな手をあげておいたのですが、
PREPAREしたりプログラムでSQLを生成したりするならば、もっと簡単ですよね・・・
SQLパズルという言葉があるほどにSQLの書き方は様々で、まだまだあります
2011/11/24 11:22:46いろいろなパターンを覚えて、
それぞれのテーブルに格納されているデータの状況にあわせた最適な方法を選べるようになるといいですね
お返事頂きありがとうございます。
2011/11/25 15:49:59「SQLパズルという言葉」は本当にその通りですね。
色々な書き方があり、それによって計算方法やスピードが
変わってくることがよく理解できました。
教えていただいた例、とても参考になりました。