Удалить дубликаты записей, кроме одной записи - PullRequest
4 голосов
/ 26 февраля 2012

У меня есть таблица с несколькими повторяющимися записями:

ID      Title
-----------------
1       Article A
2       Article A
3       Article B
4       Article C
5       Article A

В приведенном выше случае мне нужны все дубликаты заголовков и оставить только один.

Статья B и статья C в порядке. Мне нужно удалить Статьи А, кроме одной.

Пример вывода:

ID      Title
-----------------
1       Article A
3       Article B
4       Article C

Примечание: меня не беспокоит, какой ID сохранить или удалить. Все, что я хочу, - это одна запись.

Предполагая, что у меня огромная масса записей с дублирующимися заголовками

Есть предложения?

Ответы [ 4 ]

9 голосов
/ 26 февраля 2012
DELETE 
   t1 
FROM 
   tTable t1, tTable t2 
WHERE 
   t1.fieldName = t2.fieldName AND t1.id > t2.id

ELSE

создать другую таблицу, как показано ниже

CREATE TABLE myTable_new (ID INT PRIMARY KEY, Title varchar(20))

и добавить значения как

INSERT INTO myTable_new  (ID, Title) SELECT ID, DISTINCT Title FROM old_table

, учитывая, что old_table является более ранней таблицей ...

6 голосов
/ 26 февраля 2012

Это всегда будет оставлять строку с самым низким идентификатором -

DELETE t2
FROM `table` t1
INNER JOIN `table` t2
    ON t1.Title = t2.Title
    AND t1.ID < t2.ID
1 голос
/ 26 февраля 2012
DELETE FROM table WHERE Title = 'Article A' AND ID <> 1

Просто выберите идентификатор для сохранения.

0 голосов
/ 01 апреля 2013

Добавить ограничение UNIQUE над столбцом Title, игнорируя ошибки повторяющихся ключей:

ALTER IGNORE TABLE my_table ADD UNIQUE my_index (Title)

Конечно, такое ограничение также предотвратит добавление дополнительных дубликатов в таблицу в будущем; если вы не хотите применять такое ограничение в будущем, вы можете просто удалить это ограничение после того, как оно было создано:

ALTER TABLE my_table DROP INDEX my_index
...