Удаление дубликата адреса электронной почты на основе самого низкого идентификатора в MySQL - PullRequest
4 голосов
/ 30 декабря 2011

У меня есть таблица с именем emaildata, состоящая из 4 столбцов адреса электронной почты, имени домена, данных и идентификатора.

Столбец адреса электронной почты должен содержать только уникальные записи, но есть много дубликатов.Имя домена и столбец данных не являются уникальными, и, как таковые, будут содержать дубликаты, что хорошо.Столбец id имеет значение autoincrement, поэтому он будет содержать только уникальные значения.

Мой вопрос: как мне избавиться от всех строк с дублирующимися адресами электронной почты, сохраняя строку с самым низким идентификатором?

Должно быть около 370 000 строк, но в настоящее время у меня 906 000.

У меня был оператор SQL, перед которым я использовал аналогичную таблицу, и я попытался адаптировать его к этому безуспешно.

delete T1
from emaildata T1, emaildata T2
where T1.emailaddress = T2.emailaddress
and T1.id > T2.id

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

delete T1
from email_list_subscribers T1, email_list_subscribers T2
where T1.emailaddress = T2.emailaddress
and T1.subscriberid > T2.subscriberid

Я пытался запустить это для моей таблицы на удаленном сервере в phpmyadmin и послеНажав кнопку GO, панель загрузки поднимается посередине, а затем исчезает, как будто она обрабатывает, но это никогда не происходит.

Я пытался повторить это для той же таблицы, работающей на моем домашнем сервере (XAMPP) через phpmyadmin и снова с HeidiSQL - та же проблема с phpmyadmin и Heidi, похоже, вылетает.

Я пробовал другие решения, которые у меня естьвидел здесь, но я, кажется, получаю ту же проблему "тайм-аут" / сбой.У меня никогда не возникало проблем с исходным оператором, работающим на удаленном сервере, при условии, что это было по отношению к базе данных, составляющей треть от размера.

Любая информация будет оценена.

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Ваш запрос кажется правильным. Ваша проблема, кажется, проблема производительности, а не логика. Вам нужно убедиться, что оба поля emailaddress и id правильно проиндексированы в базе данных - в противном случае, если число строк приближается к миллиону, я ожидаю, что ваш запрос зависнет.

(я бы предположил, что id, вероятно, уже проиндексирован, но не emailaddress. Особенно при выполнении объединения между таблицами, если одно из этих полей не проиндексировано, вы будете смотреть на LOT полных сканов таблицы.)

Edit:

Увидев ваш комментарий, что это так, вы можете следовать документации по http://dev.mysql.com/doc/refman/5.0/en/create-index.html для создания индексов. Так что-то вроде:

CREATE INDEX email_index ON emaildata(emailaddress) USING BTREE;
0 голосов
/ 30 декабря 2011

Никогда не пытался увидеть, изменяет ли когда-нибудь array_unique (функция php) ключ, но вот как вы можете это сделать ...

выберите идентификатор и адрес электронной почты и сохраните их в массив, например, id => email

после использования array_unique для получения нового массива с первым идентификатором для каждой группы повторений ... вот как работает функция ... и после объединения двух массивов и удаления оставшихся идентификаторов из таблицы ur ...

таким образом вы получаете первый идентификатор из повторяющихся групп и уникальных значений

...