如何使用MySQL更新最小值行的值与最大值行的值?
问题描述:
我有一个表,它有一个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
欢呼!
答
您可以通过此查询获得新的量:
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;
答
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;
SQL表代表*无序*套。没有“第一个”或“第二个”重复项,除非您有一个指定顺序的列。请澄清。此外,澄清你的意思是“重复行”。我没有看到你提供的数据有任何重复。 –
你如何定义“重复”?你如何定义“第一”?而如果你有多个重复? –
伙计没有那么快关闭按钮,很明显,第一个和第二个是由'ORDER BY item_id,payment_id'给出的 – Mihai