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

У меня есть таблица со столбцами для ID, firstname, lastname, address, email и т. Д.

Есть ли способ удалить дубликаты email адресов из таблицы?

Дополнительная информация (из комментариев):

Если есть две строки с одним и тем же адресом email, у одной будут нормальные firstname и lastname, но у другой будет 'Instant' в firstname. Поэтому я могу различить их. Я просто хочу удалить тот, у которого имя «Instant».

Обратите внимание, что некоторые записи, где firstname='Instant' будет иметь только 1 email адрес. Я не хочу удалять только один уникальный адрес электронной почты, поэтому я не могу просто удалить все, где firstname='Instant'.

Пожалуйста, помогите мне.

Ответы [ 5 ]

8 голосов
/ 22 октября 2013
DELETE n1 FROM customers n1, customers n2 WHERE n1.ID > n2.ID AND n1.email = n2.email
4 голосов
/ 09 мая 2011
DELETE FROM table WHERE id NOT IN (SELECT MIN(id) FROM table GROUP BY email)

Это сохраняет самые низкие, первые вставленные идентификаторы для каждого письма.

2 голосов
/ 09 мая 2011

Хотя ответ MiPnamic по сути правильный, он не решает проблему того, какую запись вы храните, а какую выбрасываете (и как вы сортируете связанные записи). Короткий ответ: это нельзя сделать программным путем.

Задан такой запрос:

SELECT email, MAX(ID), MAX(firstname), MAX(lastname), MAX(address)
FROM customers

делает это еще хуже - поскольку вы потенциально выбираете комбинацию полей из повторяющихся строк. Вам нужно сделать что-то вроде:

SELECT csr2.*
FROM customers csr2
WHERE ID IN (
   SELECT MAX(id)
   FROM customers csr
   GROUP BY email
);

Чтобы получить уникальный набор существующих строк. Конечно, вам все равно нужно разобраться со всеми созданными записями (подсказка - это таблица идентификаторов и клиентов, не возвращенная запросом выше).

0 голосов
/ 09 мая 2011

Я не знаю, будет ли это работать в MYSQL (я не использовал его) ... но вы должны иметь возможность сделать что-то вроде следующих фрагментов.

Я бы посоветовал вам запустить их, чтобы почувствовать, правильно ли выбираются данные. Если это работает, то вы, вероятно, хотите создать ограничение для столбца.

Получить все дубликаты адресов электронной почты:

SELECT 
    EMAILADDRESS, COUNT(1)
FROM
    TABLE
GROUP BY EMAILADDRESS
HAVING COUNT(1) > 1

Затем определите ID из того, что дает:

SELECT
    ID
FROM 
    TABLE
WHERE 
    EMAILADDRESS IN (
        SELECT 
            EMAILADDRESS
        FROM
            TABLE
        GROUP BY EMAILADDRESS
        HAVING COUNT(1) > 1
    )

Затем, наконец, удалите строки, основываясь на вышеупомянутых и других ограничениях:

DELETE 
FROM 
    TABLE
WHERE
    ID IN (
        SELECT
            ID
        FROM 
            TABLE
        WHERE 
            EMAILADDRESS IN (
                SELECT 
                    EMAILADDRESS
                FROM
                    TABLE
                GROUP BY EMAILADDRESS
                HAVING COUNT(1) > 1
            )
    )  
    AND FIRSTNAME = 'Instant'
0 голосов
/ 09 мая 2011
  • Дублирование структуры таблицы
  • Ввод уникального ключа в электронную почту новой таблицы (просто для безопасности)
  • ВСТАВЛЕНИЕ в новую таблицу ВЫБОР данных из старыходна ГРУППА по адресу электронной почты
...