mysql help need

S
На сайте с 30.04.2012
Offline
73
468

Добрый

Хотелось бы решить задачу средствами mysql, без участия php. Посему просьба не загромождать ветку советами типа "напиши php скрипт". Могу. Но не хочу.

Есть некая база, из за глюка скрипта там появились дубликаты. Выявляем их по полю `ht` следующим образом


SELECT `id` FROM `cs` GROUP BY `ht` HAVING (COUNT( `ht` ) >1)

Выявляется удачно.

Теперь задачка: как удалить дублирующие записи, оставив одну единственную

Первое видимое решение - прогнать команду

select * FROM `cs` WHERE `id` in ( 

SELECT min(`id`) FROM `cs` GROUP BY `ht` HAVING (COUNT( `ht` ) >1)
)

а после успешного получения рез-ов - select * заменить на delete

И результирующую

delete FROM `cs` WHERE `id` in ( 

SELECT min(`id`) FROM `cs` GROUP BY `ht` HAVING (COUNT( `ht` ) >1)
)

прогнать несколько раз.

Но... Тут что-то не так, и mysql зависает

select * FROM `cs` WHERE `id` in ( 

SELECT min(`id`) FROM `cs` GROUP BY `ht` HAVING (COUNT( `ht` ) >1)
)

Help please!!!

izbushka
На сайте с 08.06.2007
Offline
110
#1

Гулится быстрее чем писать столько текста..

раз, два, три

siv1987
На сайте с 02.04.2009
Offline
427
#2

DELETE t.* FROM cs t INNER JOIN cs z ON z.ht=t.ht WHERE t.id>z.id

S
На сайте с 30.04.2012
Offline
73
#3

Искал, но не находил.

Вариант раз не подходит, поскольку таблица более 2 ГБ и на её фоне создание временной таблицы не есть гут.

За вариант два большая благодарность!

ALTER IGNORE TABLE cs ADD UNIQUE INDEX(ht);

работало 190 сек, но помогло

---------- Добавлено 07.04.2013 в 23:25 ----------

siv1987:
DELETE t.* FROM cs t INNER JOIN cs z ON z.ht=t.ht WHERE t.id>z.id

Видел этот пример, но что-то вникнуть не удалось

Джойним таблицу саму к себе? Щас опробую.

DELETE t.* FROM ???

вроде бы между delete и from ничего быть не должно :)

siv1987
На сайте с 02.04.2009
Offline
427
#4
Sorento:
вроде бы между delete и from ничего быть не должно

Multiple table syntax http://dev.mysql.com/doc/refman/5.0/en/delete.html

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий