У меня есть таблица, в которой ключом является комбинация столбцов 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

Как вычесть значение суммы наименьшей строки payment_id из значения суммы максимальной строки payment_id (из двух строк с одинаковым item_id), используя MySQL ?

Чтобы уточнить, это как таблица, которую я хочу.

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 

Не унывайте !

0
Cheetah Felidae 28 Май 2017 в 18:12

2 ответа

Лучший ответ

Вы можете получить новую сумму с помощью этого запроса:

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
Paul Spiegel 28 Май 2017 в 16:23
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;

Увидеть это работает

1
Mihai 28 Май 2017 в 16:18