SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.04.2009 01:11:48

toha
Участник
Зарегистрирован: 21.04.2009
Сообщений: 2

Удалить дубликаты строк в таблице

Доброго времени суток! Помогите с такой проблемой. Искал поиском, нашел подобную тему, но там была другая задача.

Необходимо удалить дубликаты строк в таблице. Таблица большая, около 100.000 записей. Дубликатов 10-25%.

Примерный вид таблицы:
ID, post_date, post_title, post_name, и т.д т.п

ID - уникальное поле, у каждого свой идентификатор от 1 до 100 тыс, везде разные
post_date - дата, уникальная для каждого поста, везде даты разные. У всех дубликатов даты различные (добавлялись дубли под разными датами)
post_content - сам текст
post_name - уникальный закодированный заголовок каждого поста, типа %d0%bf%d0%b0%d1

нужно удалить дубликаты строк. ID у всех разный. Насколько я понимаю, нужно сравнивать по post_name, если post_name совпадают, то оставлять 1 строку с уникальным post_name, а остальные удалять

Как это реализовать? помогите с запросом

Заранее благодарен!

Неактивен

 

#2 21.04.2009 13:29:10

slakey
Участник
Зарегистрирован: 20.06.2008
Сообщений: 16

Re: Удалить дубликаты строк в таблице

Ну.. мне в голову приходит такое:
вначале выбираем айди всех уникальных записей.

create table tmpid select min(ID) ID from mytable group by post_name;

потом удаляем всё, что не входит в эти уникальные записи (главное, чтобы между этими двумя действиями никто не добавил новую запись).
delete from mytable where ID not in (select ID from tmpid);

Неактивен

 

#3 21.04.2009 21:17:39

toha
Участник
Зарегистрирован: 21.04.2009
Сообщений: 2

Re: Удалить дубликаты строк в таблице

Спасибо за ответ!

Попробывал, первый запрос сработал - значения собрались в отдельную таблицу. Второй запрос - выбивает ошибку:
#1016 - Can't open file: 'mytable.MYI' (errno: 145)

Неактивен

 

#4 21.04.2009 23:14:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Удалить дубликаты строк в таблице

145 ошибка — «табличка побилась и ее надо восстановить».
REPAIR TABLE mytable

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

Ну и можно переписать удаление менее очевидным способом (в надежде, что оно будет
работать чуть быстрее):
DELETE tn
FROM tablename tn
JOIN (SELECT MAX(ID) AS ID FROM tablename GROUP BY post_name HAVING COUNT(*) > 1) tn2 USING(ID)

Неактивен

 

Board footer

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