[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: выбрать все дубликаты по полю
sanich
Есть таблица с объявлениями, очень много дубликатов по полю description
у каждого объявления есть дата добавления.

Нужно выбрать и удалить все дубликаты кроме самого свежего объявления.

Таблица object в ней поля id, description, date_

вот кое что нашел:

SELECT id, description, COUNT(description) AS cnt, date_ as date_add
FROM object GROUP BY description
HAVING (COUNT(cnt)>1)
order by cnt desc


Этот запрос показывает все дублирующие по одному записи по полю description

но мне надо все id записей всех дубликатов, кроме той у которой самая свежая дата

Не волоку в sql помогите составить запрос



Спустя 1 день, 3 часа, 45 минут (27.11.2010 - 16:28) SlavaFr написал(а):
зделай на всякий случай все для backup
delete o from  object o inner join object o2 on  o.description=o2.description and o.date_ < o2.date_

Спустя 1 день, 20 часов, 47 минут (29.11.2010 - 13:15) sanich написал(а):
Цитата (SlavaFr @ 27.11.2010 - 13:28)
зделай на всякий случай все для backup
delete o from  object o inner join object o2 on  o.description=o2.description and o.date_ < o2.date_

зацикленный запрос, он просто вешает mysql

Спустя 4 часа, 23 минуты, 5 секунд (29.11.2010 - 17:38) SlavaFr написал(а):
караул, давно не чего подобного не писал.
т.е. запрос логически правелен но б.д после него действительно зависает.

тогда пойдем другим путем ;-)
попробуй так:
1)получим в начале все ид которые нам надо удалить в таблицу temp_o
create table temp_o as select distinct o.id from object o inner join object o2 on  o.description=o2.description and o.date_ < o2.date_

2)теперь удаляем из таблицы обект.
delete form object where object_id in(select id from temp_o)

3) удаляем темп_о
drop table temp_o


я написал запрос исходя из того, что primary key называется id.
ответствености не за что не беру, так что делай backup на всякий случай.

edit: база данных в общем не зависла, а просто сильно задумалась :) через определенное время предложенный мной первоначально запрос с delete был всеже выполнен

Спустя 4 часа, 40 минут, 4 секунды (29.11.2010 - 22:18) sanich написал(а):
Дело в том что даже запрос

create table temp_o as select distinct o.id from object o inner join object o2 on  o.description=o2.description and o.date_ < o2.date_



или просто

select distinct o.id from object o inner join object o2 on  o.description=o2.description and o.date_ < o2.date_


подвисает, ждал минут 10..

Записей 34000 всего в этой таблице

Спустя 5 минут, 25 секунд (29.11.2010 - 22:24) sergeiss написал(а):
Индексы есть в таблице, по используемым ключевым полям?

Спустя 2 часа, 14 минут, 29 секунд (30.11.2010 - 00:38) sanich написал(а):
Цитата (sergeiss @ 29.11.2010 - 19:24)
Индексы есть в таблице, по используемым ключевым полям?

не совсем понял вопрос, вот все индексы

Спустя 11 часов, 52 минуты, 55 секунд (30.11.2010 - 12:31) SlavaFr написал(а):
да вроде все правельно индексированно.

Спустя 1 час, 1 минута (30.11.2010 - 13:32) dr_Lev написал(а):
по FULLTEXT, по-моему, тяжело сравнивать... я бы добавил поле description_md5 и внес бы туда md5(description_ind), и от него бы плясал...
ALTER TABLE object ADD description_md5 char(16);
UPDATE object SET description_md5 = MD5(description_ind);
CREATE INDEX object_desc_md5 ON object (description_md5);
CREATE TABLE temp_o AS SELECT DISTINCT o.id FROM object o INNER JOIN object o2 on o.description_md5=o2.description_md5 and o.date_ < o2.date_;
DELETE FROM object WHERE object_id IN(SELECT id FROM temp_o);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.