2017-05-28 123 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

相關問題