2012-01-31 7 views
1

У меня есть много телефонных номеров, которые дублируются в поле telephone. Как это сделать с помощью SQL?Удаление дубликатов

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

Я также хочу знать, сколько дубликатов?

Благодаря

+0

Возможный дубликат http://stackoverflow.com/q/8567007/27535 или http://stackoverflow.com/q/8590010/27535 и многие другие – gbn

+0

Должен ли использоваться только SQL? Не можете написать для этого немного кода? Это будет намного проще с кодом fuction –

+0

Возможный дубликат [удалить дубликаты в базе данных mysql] (http://stackoverflow.com/questions/8793231/remove-duplicates-in-mysql-database) –

ответ

1

Попробуйте это:

DELETE FROM phonenumbers WHERE telephone = "[phone number here]" AND id NOT IN (SELECT id FROM phonenumbers WHERE telephone = "[phone number here]" LIMIT 1) 

Это удалит все записи с этим номером телефона, за исключением первого один

Примечания, это если у вас есть уникальный идентификатор ID в вашем Таблица. (И ваша имя_таблица является phonenumbers Изменить что в вашу реальную имя_таблицу

0

Этот запрос может помочь:..

DELETE `P`.* 
FROM `phones` `P` 
LEFT JOIN ( 
    SELECT `telephone`, MIN(`id`) `ids` 
    FROM `phones` 
    GROUP BY `telephone` 
) `TA` ON `P`.`id` = `TA`.`ids` 
WHERE `TA`.`ids` IS NULL; 

Пожалуйста, обратите внимание, чтобы изменить имена таблиц и имена полей в соответствии с вашей схемой Кроме того, выше, предполагает, что ваша таблица имеет первичный столбец, обозначенный как id в приведенном выше запросе

логика:.

  1. с помощью подзапроса, мы сначала выяснить все т номера телефонов и первую запись для каждого номера. Эти записи, которые останутся, а остальные удалены
  2. тогда мы делаем левое соединение между «телефонами» таблицей и производной таблицей, и удалить все записи из «телефонов», которые не соответствуют в производной таблице

Преимущество с вышеуказанным запросом заключается в том, что он удалит все повторяющиеся записи за один снимок.

Для дублирующих подсчетов, вы можете сделать что-то вроде:

SELECT `telephone`, COUNT(1) `cnt` 
FROM `phones` 
GROUP BY `telephone` 
HAVING COUNT(1) > 1 

Надеется, что это помогает!

+0

@ user791022, вы сделали попробуйте решение? Это сработало? – Abhay

0

Вот простой один, который копирует ваш стол на новый не хватает продублировать полей «телефонных»:

CREATE TABLE addrbook2 
    SELECT * FROM addrbook GROUP BY telephone 

Затем можно удалить старую таблицу addrbook и переименовать новый addrbook2 в addrbook, если вы хотите.