2017-01-17 25 views
1

itemsのリストはordersに属します。各itemfee_percentageフィールドを持ちます。 itemsの合計は、表のtotal_priceです。最終的に関連付けられたレコードを更新する方法

達成したいことはありますか? 最後に関連付けられた項目のfeeフィールドを更新したいとします。

_________________________  __________________________________________ 
| order ID | total_price|  | id | order_id | fee_percentage | fee | 
-------------------------  ------------------------------------------ 
| 334 |  425 |  | 1 | 334 |  50  | 212 | 
    # The `fee` should be 213 => | 2 | 334 |  50  | 212 | 

あなたがitemsの合計が、私は最後の項目feeに残りの料金を追加したい424になります見ることができるように。 (したがって、アイテムid2の料金は213でなければなりません)。

お願いします。

は、これは私がこれまで

UPDATE items AS i 
LEFT JOIN orders AS o ON o.order_id = b.order_id 
LEFT JOIN (
    SELECT order_id, SUM(fee) AS sum_fee 
    FROM items 
    GROUP BY order_id 
    WHERE deleted = 0 
) AS b1 ON b1.order_id = b.order_id 
SET b.fee = b.fee + (o.total_price - b1.sum_fee) 
WHERE b.deleted = 0; 

私は以前のクエリに添付するか、受注レコード内のlast_item_idを更新しようとしています書かれているが、それは動作しませんものです。

LEFT JOIN (
    SELECT order_id, MAX(id) AS b_last_item_id 
    FROM items 
    WHERE deleted = 0 
    GROUP BY order_id  
) AS b1 ON b1.order_id = b.order_id 
+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-veryを参照してください。 -simple-sql-query – Strawberry

答えて

0
UPDATE items AS b 
    JOIN (
     SELECT MAX(i.id) mid, o.curr_price - SUM(i.fee) AS diff 
     FROM items AS i 
     INNER JOIN orders AS o ON i.order_id = o.order_id 
     GROUP BY i.order_id 
     ORDER BY i.order_id, i.id 
    ) AS v ON b.id = v.mid 
    SET b.fee = b.fee + v.diff WHERE v.diff <> 0; 
+0

これはうまくいくようです。 –

+1

はるかに迅速かつ正確です。 – Fury

1

これは少しトリッキーです。私は、次のクエリが動作するはずだと思う:

UPDATE items AS i 
JOIN orders AS o ON i.order_id = o.orderID 
JOIN (
    SELECT order_id, SUM(fee) AS sum_of_fees 
    FROM items 
    GROUP BY order_id 
) AS i2 ON i2.order_id = o.orderID 
LEFT JOIN items AS i3 
    ON i3.order_id = o.orderID AND i3.id > i.id 
SET i.fee = o.total_price - (sum_of_fees - i.fee) 
WHERE i3.id IS NULL; 

使用派生テーブルはorder_idあたりの手数料の合計を計算します。追加LEFT JOINitemsにテーブルがあるレコードです最大id値を持つレコードを識別するために必要とされている

SUM(fee) - i.fee 

:この値を用いて、我々は、すべての項目の合計が、現在のアイテムを計算することができます実際に更新されています。

関連する問題