ФорумРазработкаБазы данных → выбрать все дубликаты по полю кроме дубликата с самой большой датой

выбрать все дубликаты по полю кроме дубликата с самой большой датой

  • sanich

    Сообщения: 20 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 1:43

    Есть таблица с объявлениями, очень много дубликатов по полю 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 помогите составить запрос
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 2:13, спустя 29 минут 33 секунды

    SELECT GROUP_CONCAT(id) FROM object GROUP BY description ORDER BY date_ DESC

    потом
    DELETE FROM object WHERE id NOT IN (рузультат первого запроса)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 ноября 2010 г. 2:15, спустя 2 минуты 10 секунд

    можно в 1 запрос объеденить
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 2:33, спустя 17 минут 46 секунд

    попробовал навскидку мускуль ругается, правда я с UPDATE пробовал
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 26 ноября 2010 г. 2:37, спустя 4 минуты 7 секунд

    ты с GROUP_CONCAT пробовал? GROUP_CONCAT не нужен
    Спустя 38 сек.
    а, бля, я фейл. Это ж одна таблица
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 ноября 2010 г. 2:55, спустя 18 минут 35 секунд


    можно в 1 запрос объеденить
    доктриной? :D
    Сапожник без сапог
  • sanich

    Сообщения: 20 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 4:55, спустя 1 час 59 минут 56 секунд


    SELECT GROUP_CONCAT(id) FROM object GROUP BY description ORDER BY date_ DESC

    потом
    DELETE FROM object WHERE id NOT IN (рузультат первого запроса)



    Что делает первый запрос?

    выбирает id всех объявленлений, у которых одинаковое поле description, но там же есть и самое последнее объявление, а его не должно быть
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 5:31, спустя 35 минут 16 секунд

    группирует по description самые последние записи
  • sanich

    Сообщения: 20 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 5:33, спустя 2 минуты 21 секунду

    группирует по description самые последние записи


    а мне надо все дуюликаты по description кроме самого последнего по дате
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 5:43, спустя 9 минут 39 секунд

    ты внимательно посмотри, что я написал. к первоисточникам обратись если что ..
  • sanich

    Сообщения: 20 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 8:41, спустя 2 часа 58 минут 42 секунды

    SELECT GROUP_CONCAT(id) FROM object GROUP BY description ORDER BY date_ DESC



    в любом случае

    инструкция

    DELETE FROM object WHERE id NOT IN (SELECT GROUP_CONCAT(id) FROM object GROUP BY description ORDER BY date_ DESC)


    выдает ошибку

    You can't specify target table 'object' for update in FROM clause
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 26 ноября 2010 г. 8:44, спустя 2 минуты 49 секунд

    понятно.
    тогда думай сам :)
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 26 ноября 2010 г. 10:04, спустя 1 час 20 минут 1 секунду

    SELECT COUNT(*) AS descr_count, max(d) AS last_change, descr 
    FROM news
    GROUP BY descr
    ιιlllιlllι унц-унц
  • sanich

    Сообщения: 20 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2010 г. 14:05, спустя 3 дня 4 часа

    Вот запрос, который делает то, что мне надо, т.е. выбирает id объявлений дубликатов, кроме самых последних

    SELECT `id` FROM `object` WHERE `id` NOT IN(
    SELECT tbl.id FROM (SELECT `id`, MAX(`date_`) FROM `object` GROUP BY `description`) tbl
    )


    Но этот запрос выполняется 2 минуты при 34000 записей это локально
    а на хостинге 100000 записей, там вообще по таймауту обрубило.

    Как можно этот запрос оптимизировать?
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2010 г. 14:07, спустя 2 минуты 39 секунд

    эээ.. а в голову не приходило, что лучше выбирать МЕНЬШЕЕ количество записей? ну то есть что мы с artoodetoo, пытаемся ненавязчиво внушить

Пожалуйста, авторизуйтесь, чтобы написать комментарий!