Найти дубликат записи MySQL и обновить первый дубликат с последним значением дубликата - PullRequest
4 голосов
/ 14 марта 2011

У меня есть такая таблица.

ID    Name     Tag    
1     Orange   tea     
2     Pear     light    
3     Apple    tea
4     Juice    tea
5     Cocoa    baseball
6     Camera   baseball

Что я хочу сделать, это для строк, которые имеют дубликаты тегов, я хочу обновить имя ПЕРВОГО вхождения с ПОСЛЕДНИМ вхождением.

Так что в приведенном выше примере я хотел бы обновить имя идентификатора 1 с оранжевого до сока, удалить остальные (# 3, # 4) и обновить идентификатор 5 с какао на камеру и удалить # 6.

Какя сделал бы это используя MySQL с PHP?Или, возможно, можно просто сделать это внутри MySQL?

Спасибо!

1 Ответ

5 голосов
/ 14 марта 2011

Для запроса UPDATE нам нужно получить минимальный и максимальный идентификаторы для каждого тега, только если есть повторяющиеся строки:

UPDATE table t
  JOIN (
    SELECT MinID, b.Name LatestName
    FROM table b
    JOIN (
      SELECT MIN(ID) MinID, MAX(ID) MaxID
      FROM table
      GROUP BY tag
      HAVING COUNT(*) > 1
    ) g ON b.ID = g.MaxID
  ) rs ON t.ID = rs.MinID
SET t.Name = LatestName;

Для запроса DELETE мы удаляем все строки, которые не являются первыми идентификаторами его группы тегов:

DELETE t.*
FROM table t
  LEFT JOIN (
    SELECT MIN(ID) MinID
    FROM table
    GROUP BY tag
  ) g ON t.ID = g.MinID
WHERE g.MinID IS NULL;
...