0

次の 2 つのテーブルがあります。

* ORDER 
  - id
  - pay_type
* ORDER_PRICE
  - order_id
  - dt
  - price

注文価格は次のように変更できます。

order_id | price | dt  
       1 | 100.3 | 2013-10-25  
       1 | 105.7 | 2013-10-28  
       2 | 207.4 | 2013-09-13  
       4 | 98.0 | 2013-10-03

そのような日付の価格履歴を選択できます。

 SELECT 
o.`id`,
    (SELECT op.`price` FROM `order_price` op 
     WHERE op.`order_id`=o.`id` AND op.`dt` <= '2013-10-26'
     ORDER BY op.`dt` DESC LIMIT 1) order_price
    FROM `order` o 

指定された日付の適切な価格が表示されます

order_id | price | dt  
       1 | 100.3 | 2013-10-25   
       2 | 207.4 | 2013-09-13  
       4 |  98.0 | 2013-10-03

しかし、2番目の列の合計が必要です(注文番号に関係なく、1つの番号のみ-この場合は405.7)。

このような状況の解決策はありますか?何千もの注文がある可能性があるため、mysql の外でレコードを合計するのは間違っていると思います。多分それは最初からずっと間違っていて、他の構造が必要ですか?お時間をいただき、ありがとうございました。

4

1 に答える 1

0

コアクエリは次のようになるはずです...

      SELECT o.order_id
           , op.price
           , op.dt
        FROM orders o 
        JOIN order_price op
          ON op.order_id = o.order_id
        JOIN 
           ( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
          ON x.order_id = op.order_id 
         AND x.max_dt = op.dt;

...このように書き直すと、合計が得られます

SELECT o.order_id
     , SUM(op.price) price
     , op.dt
  FROM orders o 
  JOIN order_price op
    ON op.order_id = o.order_id
  JOIN 
     ( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
    ON x.order_id = op.order_id 
   AND x.max_dt = op.dt
 GROUP
    BY order_id,dt
  WITH ROLLUP;

...またはこの方法

SELECT SUM(price) total 
FROM
 ( SELECT o.order_id
       , op.price
       , op.dt
    FROM orders o 
    JOIN order_price op
      ON op.order_id = o.order_id
    JOIN 
       ( SELECT order_id, MAX(dt) max_dt FROM order_price WHERE dt < '2013-10-26' GROUP BY order_id ) x
      ON x.order_id = op.order_id 
     AND x.max_dt = op.dt
 ) z;

...または、アプリケーション レベルで合計を取得するだけです。

于 2013-11-09T09:42:40.563 に答える