Обновить данные для дубликатов

Есть таблица заказов, в ней имеются дублирующиеся заказы

orders

uuid | user_uuid | product_uuid | created_at | status

Есть статусы 5 - archived и 6 - cancelled

Суть в чем - надо обновить все дубликаты, переместив в cancelled все дублирующиеся заказы кроме самого нового

Пробовал сделать так

 update orders o
 join
 (
     select user_uuid, product_uuid, max(created_at) date, count(*) count
     from orders
     where user_uuid is not null and status_id not in (5, 6)
     group by user_uuid, product_uuid
     having count > 1
 ) dup
 on o.user_uuid = dup.user_uuid
 and o.product_uuid = dup.product_uuid
 and o.created_at != dup.date
set status_id = 6
where o.uuid is not null;

Но есть проблема - у некоторых заказов даты идентичны и в таком случае такие заказы не обновляются. Может у кого есть мысль как это дело можно обновить чтобы заработало?


Ответы (1 шт):

Автор решения: Alex

Помощь от Akina:

  1. Добавляем временное int поле в таблицу
  2. Записываем значения от 1 до n
  3. Используем это поле как дополнительный критерий сортировки

Пример: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ac6053eb752cc4960b28164aa11e02a6

→ Ссылка