2017-01-17 114 views
1

我有items列表屬於orders。每個item都有fee_percentage字段。並且items的總和是total_priceorders表中。如何更新最終關聯記錄

我想實現什麼? 我想更新上次關聯項目的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總和將是424我想剩下的費用添加到最後一個項目fee。 (所以物品id 2的費用應該是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費的總和。使用這個值,我們可以計算出所有項目的總和而是作爲當前項:需要以識別具有最大id值,這是記錄在記錄

SUM(fee) - i.fee 

另外一個LEFT JOINitems表實際上正在更新。

相關問題