Обновить последнюю запись в повторяющихся записях - PullRequest
0 голосов
/ 28 января 2020

У меня есть таблица продуктов, и у меня есть дубликаты записей в таблице согласно product_code. Вместо того, чтобы удалить старую запись, мне нужно обновить старую запись и сохранить самую последнюю запись. Итак, вот как они выглядят в таблице

id      product_code    Qty     Type    updatedDate                 addedDate
1       AB12            5       AB      2017-05-11 09:00:00         2017-05-11 09:00:00
2       CD12            4       AC      2016-05-11 09:00:00         2016-05-11 09:00:00     
3       EF12            5       AB      2016-05-11 09:00:00         2016-05-11 09:00:00
4       AB12            6       AB      2016-05-11 09:00:00         2016-05-11 09:00:00
5       GH12            5       AC      2016-05-11 09:00:00         2016-05-11 09:00:00
6       IJ12            6       AB      2016-05-11 09:00:00         2016-05-11 09:00:00
7       KL12            8       AB      2016-05-11 09:00:00         2016-05-11 09:00:00
8       EF12            10      AB      2017-05-11 09:00:00         2017-05-11 09:00:00
9       GH12            1       AC      2017-05-11 09:00:00         2017-05-11 09:00:00
10      MN12            3       AB      2016-05-11 09:00:00         2016-05-11 09:00:00

Для всех старых записей в соответствии с addedDate мне нужно установить Qty в '0'.

Я выбрал записи из следующего запроса, но мне нужно обновить их до последней записи. Вот запрос

SELECT id, product_code, Qty, Type, updatedDate, addedDate 
FROM products WHERE Type = 'AB'
GROUP BY `product_code`
HAVING COUNT(`product_code`) > 1 ORDER BY `products`.`addedDate`

Ответы [ 3 ]

2 голосов
/ 28 января 2020

При самостоятельном присоединении:

update tablename t
inner join tablename tt 
on tt.product_code = t.product_code and tt.addedDate > t.addedDate
set t.qty = 0;

См. Демоверсию .

0 голосов
/ 28 января 2020

Вот еще одна идея ...

update tablename t
  LEFT 
  join
     ( SELECT MAX(id) id FROM tablename GROUP BY product_code ) x
    ON x.id = t.id
   set t.qty = 0
 WHERE x.id IS NULL;

Установка временного столбца для старых значений qty, затем установка всех старых значений qty на ноль, а затем выполнение (внутреннее соединение) обратного вышеописанному имеет потенциал быть быстрее.

0 голосов
/ 28 января 2020

Вы можете попробовать:

UPDATE yourTable t1
SET Qty = 0
WHERE
    EXISTS (SELECT 1 FROM yourTable t2
            WHERE t2.product_code = t1.product_code AND t2.id <> t1.id) AND
    NOT EXISTS (SELECT 1 FROM yourTable t2
                WHERE t2.addedDate < t1.addedDate);

Первое существующее предложение гарантирует, что product_id встречается более одного раза, то есть эта запись является «дубликатом», как вы ее определили. Второе предложение о существовании гарантирует, что мы не можем найти любую другую более старую запись в дублирующем наборе, подразумевая, что соответствующая запись является самой старой. Если оба условия выполняются, то мы обновляем количество до нуля.

...