如何使用MySQL使用最大值行的值更新最小值行的值?

时间:2017-05-28 15:12:22

标签: mysql sql

我有一个表,其中包含item_id和payment_id列的组合作为键。

每两行都有相同的item_id值。

这就是表格的样子。

item_id  payment_id  amount
      1     140       1000
      1     141       3000

      2     141        500
      2     145        600

      3       4       4000
      3     735       9000

如何使用 MySQL 从最大payment_id行(具有相同item_id的两行)的金额值中减去最小payment_id行的金额值?

澄清一下,这就是我想要的表格。

item_id  payment_id  amount
      1     140       1000
      1     141       2000 : 3000 - 1000

      2     141        500
      2     145        100 :  600 -  500

      3       4       4000 
      3     735       5000 : 9000 - 4000 

振作!

2 个答案:

答案 0 :(得分:1)

UPDATE tt JOIN (SELECT item_id, MAX(payment_id) mp , (SUBSTRING_INDEX(GROUP_CONCAT(amount ORDER BY payment_id DESC),',',1) - SUBSTRING_INDEX(GROUP_CONCAT(amount ORDER BY payment_id ),',',1))  maxdif FROM tt GROUP BY item_id) s  
ON tt.item_id=s.item_id
SET tt.amount =s.maxdif
WHERE tt.payment_id =s.mp AND  tt.item_id=s.item_id;



SELECT * FROM tt;

See it working

答案 1 :(得分:1)

您可以使用此查询获取新金额:

select p1.item_id, p1.payment_id, p1.amount - (
    select p0.amount
    from payments p0
    where p0.item_id    = p1.item_id
      and p0.payment_id < p1.payment_id
    order by p0.payment_id
    limit 1
) as new_amount
from payments p1
having new_amount is not null;

它会减去&#34; last&#34;具有相同item_id的行(如果存在)。

然后,您可以在UPDATE语句中将该查询用作连接到原始表的派生表:

update payments p
join (
    select p1.item_id, p1.payment_id, p1.amount - (
        select p0.amount
        from payments p0
        where p0.item_id    = p1.item_id
          and p0.payment_id < p1.payment_id
        order by p0.payment_id
        limit 1
    ) as new_amount
    from payments p1
    having new_amount is not null    
) p1 using (item_id, payment_id)
set p.amount = p1.new_amount;

演示:http://rextester.com/DJD86481