SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.10.2015 14:39:04

Ганибек
Участник
Зарегистрирован: 12.10.2015
Сообщений: 3

Как удалить дубликат из нескольких полей

Есть таблица coll из 10 полей. Порядка 35 000 000 записей

Есть 3 поля. назовем f1,f2,f3 которые не уникальны, а должны быть таковыми.
Делаю запрос
select f1,f2,f3, count(*) from coll group by f1, f2, f3 having count(*)>1

Обнаружил что отображенное количество count(*) каждого из дубля равно двум.

Соответственно записи обнаруженные этой выборкой надо удалить.

Как это сделать? Простые решения не получаются.

Неактивен

 

#2 12.10.2015 14:47:36

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как удалить дубликат из нескольких полей

Прочтите до конца
http://sqlinfo.ru/forum/viewtopic.php?id=274


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 12.10.2015 15:23:12

Ганибек
Участник
Зарегистрирован: 12.10.2015
Сообщений: 3

Re: Как удалить дубликат из нескольких полей

У меня чуть другая ситуация, сравнивать надо на дубликаты значений группы полей f1,f2,f3 вместе. Concat делать не вариант, долго слишком
т.е.
есть таблица
     f1,      f2,      f3     f4 ... f10
1/  abc     12      ab     xy ........
2/  abc     12      ab     az .......

одну (любую) из этих записей надо убить

Неактивен

 

#4 12.10.2015 17:17:12

Ганибек
Участник
Зарегистрирован: 12.10.2015
Сообщений: 3

Re: Как удалить дубликат из нескольких полей

В общем ничего не осталось поделать как выгрузить результаты запроса в другую таблицу, и убить дубликаты сравнением. Как ни странно на 35000000 записей (таблица 2 Гб) затратилось пол секунды. Видимо благодаря индексу на эти 3 поля.

Неактивен

 

#5 12.10.2015 17:35:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как удалить дубликат из нескольких полей

Ещё можно

DELETE t1 FROM coll t1 LEFT JOIN coll t2
ON t1.f1 = t2.f1 AND t1.f2 = t2.f2 AND t1.f3 = t2.f3 AND t1.id < t2.id
WHERE t2.id IS NOT NULL;
удалит из таблицы строки с одинаковыми значениями полей f1,f2,f3 и меньшим id.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson