Mysql 如何更新最终关联记录

Mysql 如何更新最终关联记录,mysql,Mysql,我有属于订单的项目列表。每个项目都有费用百分比字段。项目的总和是订单表中的总价 我想要实现什么? 我想更新上次关联项目的费用字段 _________________________ __________________________________________ | order ID | total_price| | id | order_id | fee_percentage | 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  | 
如您所见,项目总数将为424。我想把剩下的费用加到最后一项费用上。因此,项目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;
我尝试将其附加到上一个查询或更新订单记录中的最后一个\u item\u 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

这有点棘手。我认为以下查询应该有效:

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;
使用的派生表计算每个订单id的费用总和。使用此值,我们可以计算除当前项目外的所有项目的总和,如下所示:

SUM(fee) - i.fee

为了识别具有最大id值的记录,即实际正在更新的记录,需要一个额外的“左联接到项”表。

请参阅更快、更准确的内容。
   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;