Если у вас нет MySQL 8:
Здесь я просто добавляю id
строки к адресу электронной почты:
UPDATE my_table JOIN (
SELECT email, MAX(id) AS max_id, COUNT(*) AS cnt FROM my_table
GROUP BY email
HAVING cnt > 1
) sq ON my_table.email = sq.email AND my_table.id <> sq.max_id
SET my_table.email = CONCAT( my_table.id, my_table.email)
;
См. DB -Fiddle
Внутренний запрос:
SELECT email, MAX(id) AS max_id, COUNT(*) AS cnt FROM my_table
GROUP BY email
HAVING cnt > 1
ищет все дублирующиеся электронные письма (то есть существует более одной строки с одним и тем же адресом электронной почты) и вычисляет строку максимальное значение id
для каждого адреса электронной почты. Для демонстрационных данных в моей демонстрации DB-Fiddle будет возвращено следующее:
| email | max_id | cnt |
| ---------------- | ------ | --- |
| emaila@dummy.com | 3 | 3 |
| emailb@dummy.com | 5 | 2 |
Приведенный выше внутренний запрос называется таблицей sq
.
Теперь, если я присоединюсь my_table
с приведенным выше запросом следующим образом:
SELECT my_table.* from my_table join (
SELECT email, MAX(id) AS max_id, COUNT(*) AS cnt FROM my_table
GROUP BY email
HAVING cnt > 1
) sq on my_table.email = sq.email and my_table.id <> sq.max_id
Я получаю:
| id | email |
| --- | ---------------- |
| 1 | emaila@dummy.com |
| 2 | emaila@dummy.com |
| 4 | emailb@dummy.com |
, потому что я выбираю из my_table
все строки, которые имеют повторяющиеся адреса электронной почты (условие my_table.email = sq.email
, кроме для строк, которые имеют наибольшее значение id
для каждого адреса электронной почты (условие my_table.id <> sq.max_id
).
Это идентификаторы из вышеуказанного объединения, чьи адреса электронной почты должны быть изменены.