2017-05-28 139 views
0

我有一个表,它有一个item_id和payment_id列组合作为关键。如何使用MySQL更新最小值行的值与最大值行的值?

每两行都有相同的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 

如何从(具有相同ITEM_ID两排),使用的MySQL最大payment_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 

欢呼!

+3

SQL表代表*无序*套。没有“第一个”或“第二个”重复项,除非您有一个指定顺序的列。请澄清。此外,澄清你的意思是“重复行”。我没有看到你提供的数据有任何重复。 –

+1

你如何定义“重复”?你如何定义“第一”?而如果你有多个重复? –

+0

伙计没有那么快关闭按钮,很明显,第一个和第二个是由'ORDER BY item_id,payment_id'给出的 – Mihai

回答

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; 

它将减去 “最后” 行的量与同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

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