MySQL Удалить дубликаты в последовательных строках - PullRequest
3 голосов
/ 23 ноября 2011

Предположим, эта таблица:

ID ColA ColB
1   7    8
2   7    9
3   7    9
4   5    8
5   6    9
6   6    9
7   5    4

PK - это идентификационный номер.Теперь я хочу удалить все дубликаты ColA и ColB в последовательных строках.

В этом примере строки 2,3 и 5,6 содержат дубликаты.Они должны быть удалены, чтобы оставался более высокий идентификатор.

Вывод должен быть:

ID ColA ColB
1   7    8

3   7    9
4   5    8

6   6    9
7   5    4

Как это можно сделать с mySQL?

Спасибо, Юрген

Ответы [ 4 ]

2 голосов
/ 23 ноября 2011
CREATE TEMPORARY TABLE duplicates (id int primary key)

INSERT INTO duplicates (id)
    SELECT t1.id
      FROM table t1
      join table t2 on t2.id = t1.id + 1
     WHERE t1.ColA = t2.ColA
       and t1.ColB = t2.ColB

-- SELECT * FROM duplicates --> are you happy with that? => delete
DELETE table
  FROM table
  join duplicates on table.id = duplicates.id
1 голос
/ 23 ноября 2011
SELECT 
    ID
FROM
    MyTable m1
WHERE
    0 < (SELECT 
            COUNT(*)
        FROM
            MyTable m2
        WHERE
            m2.ID = m1.ID - 1 AND 
            m2.ColA = m1.ColA AND 
            m2.ColB = m1.ColB)

и затем вы можете использовать запрос

delete from MyTable where ID in ...

.Таким образом, он наверняка будет работать в любой версии.

0 голосов
/ 23 ноября 2011

Я назвал первую таблицу «тест».

Сначала создайте таблицу, в которой будут храниться все идентичные комбинации ColA и ColB:

create temporary table tmpTable (ColA int, ColB int);
insert into tmpTable select ColA,ColB from test group by ColA, ColB;

Теперь выберите максимальный идентификатор в исходной таблице для каждой идентичной комбинации ColA и ColB. Поместите это в новую таблицу (называемую idsToKeep, потому что это строки, которые мы не хотим удалять):

create temporary table idsToKeep (ID int);
insert into idsToKeep select (select max(ID) from test where test.ColA=tmpTable.ColA and test.ColB=tmpTable.ColB) from tmpTable;

Наконец, удалите все записи из исходной таблицы, которых нет в таблице idsToKeep:

delete from test where ID <> all (select ID from idsToKeep);
0 голосов
/ 23 ноября 2011

В зависимости от того, сколько у вас есть записей, это может быть не самым эффективным:

SELECT (SELECT TOP 1 id FROM table WHERE colA = m.colA AND colB = m.colB ORDER BY id DESC) AS id, m.*
FROM (SELECT DISTINCT colA, colB
      FROM  table) m

Там могут быть синтаксические ошибки, потому что я обычно использую mssql, но идея должна быть похожей.

...