Нужна помощь в обновлении записей с повторяющимися значениями в MySQL - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть mysql - таблица, представляющая ордера, которые синхронизируются с моей базой данных сложным syn c -процессом из остальные API - из-за ошибки, у меня есть дубликаты, и я не достаточно знаком с mysql, чтобы исправить это должным образом - и я хотел бы избежать "php -way", который я мог бы сделать сам.

Дублирующая запись в моей таблице имеет указанный столбец c с тот же идентификатор заказа - и другой столбец с именем «record_state», который представляет состояние записи (1 = самая новая запись, 2 = старая запись). Я знаю, как найти дубликаты с помощью следующего оператора:

SELECT 
orderid, 
COUNT(orderid)
FROM
orders
WHERE `time_get` > 1584226800 AND `system` = 'live' and `record_state` = 1 and `hidden` = 0 AND `deleted` = 0
GROUP BY orderid
HAVING COUNT(orderid) > 1

Что мне нужно сделать сейчас, это обновить любой старый дубликат этих результатов (например, count (orderid) = 2). У меня есть столбец времени, который я мог бы использовать для их сравнения. Основная цель для меня - иметь только самые новые заказы с record_state = 1, более старые дубликаты получат record_state = 2. Я буду рад любой помощи - это живая производственная таблица моей компании, поэтому я абсолютно не должен испортить это. Заранее спасибо, Оливер

1 Ответ

1 голос
/ 24 апреля 2020
UPDATE orders o1
SET o1.record_state = 2
WHERE ( all conditions except record_state ) 
  AND o1.record_state != 2
  AND EXISTS ( SELECT NULL
               FROM orders o2
               WHERE o1.orderid = o2.orderid
                 AND o1.time_get < o2.time_get
                 AND o2.record_state = 1 )

Т.е. мы обновляем все записи с record_state != 2, если существует более поздняя запись с теми же orderid и record_state = 1.


mysql говорит: использование o1 в части предложения FROM не допускается

Если это так, попробуйте

UPDATE orders o1, orders o2
SET o1.record_state = 2
WHERE ( all conditions except record_state by o1 ) 
  AND o1.record_state != 2
  AND o1.orderid = o2.orderid
  AND o1.time_get < o2.time_get
  AND o2.record_state = 1;
...