у каждого объявления есть дата добавления.
Нужно выбрать и удалить все дубликаты кроме самого свежего объявления.
Таблица 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) |
зделай на всякий случай все для backupdelete 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
2)теперь удаляем из таблицы обект.
3) удаляем темп_о
я написал запрос исходя из того, что primary key называется id.
ответствености не за что не беру, так что делай backup на всякий случай.
edit: база данных в общем не зависла, а просто сильно задумалась :) через определенное время предложенный мной первоначально запрос с delete был всеже выполнен
т.е. запрос логически правелен но б.д после него действительно зависает.
тогда пойдем другим путем ;-)
попробуй так:
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 написал(а):
Дело в том что даже запрос
или просто
подвисает, ждал минут 10..
Записей 34000 всего в этой таблице
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);