За последние 24 часа нас посетили 18637 программистов и 2032 робота. Сейчас ищут 978 программистов ...

Удаление дубликатов из базы

Тема в разделе "PHP и базы данных", создана пользователем Bueno, 21 июл 2013.

  1. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Всем привет!

    Есть такой запрос:
    Код (Text):
    1. DELETE tn FROM tests tn JOIN (SELECT MAX(ID) AS ID FROM tests GROUP BY url HAVING COUNT(*) > 1) tn2 USING(ID)
    Он работает и он удаляет дублированные поля 'url' из таблицы 'tests'

    Проблема в том, что мне надо удалять дублированные поля только с конкретными 'id' , и это никак не получается.
    Помогите разобраться...

    Спасибо!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    Код (Text):
    1. DELETE ... весь твой запрос... WHERE tn.id=:конкретный_id
    нет?
     
  3. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Да, я так тоже делал, но в один запрос удаляется только одна запись а мне надо в один запрос удалить все дубликаты, есть еще такой вариант
    Код (Text):
    1. DELETE t1 FROM tests AS t1, tests AS t2 WHERE t1.url = t2.url AND t1.title = t2.title AND t1.id > t2.id AND t1.keyword_id=?
    он хорошо работает с небольшими таблицами а у меня 500000+ и сервак просто повесился
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    ты что-то путаешся в показаниях. то тебе конкретный id, то все. ты сначала подумай, а потом задай вопрос.
     
  5. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Извините за неточность!

    Структура базы:
    Код (Text):
    1. id   key_id   url
    2. -----------------------------
    3. 1    5        mail.pu
    4. 2    5        mail.pu
    5. 3    5        mail.pu
    6. 4    5        mail.pu
    7. 5    6        gmail.kom
    8. 6    7        yandex.pu
    9. 7    7        yandex.pu
    10. ......
    11. -----------------
    Мне надо удалить только те повторяющиеся поля в которых 'key_id=5'
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    массовое удаление дубликатов - моя версия. остаются записи с минимальным id
    Код (Text):
    1. DELETE t1
    2. FROM
    3.   tests AS t1 JOIN
    4.   (
    5.     SELECT key_id, MIN(id) AS id
    6.     FROM tests
    7.     GROUP BY key_id
    8.     HAVING COUNT(*) > 1
    9.   ) AS t2 ON (t1.key_id = t2.key_id) AND (t1.id <> t2.id)
    то же, но с указанием конкретного key_id. меняем GROUP BY на WHERE во внутреннем запросе
    Код (Text):
    1. DELETE t1
    2. FROM
    3.   tests AS t1 JOIN
    4.   (
    5.     SELECT key_id, MIN(id) AS id
    6.     FROM tests
    7.     WHERE key_id = ?
    8.     HAVING COUNT(*) > 1
    9.   ) AS t2 ON (t1.key_id = t2.key_id) AND (t1.id <> t2.id)
    должно работать быстро на больших объемах. надеюсь у тебя есть индекс по key_id?!
     
  7. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Работает быстро. Спасибо!
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.249
    Адрес:
    там-сям
    незачто. заведутся излишки вебманек - можешь слить по реквизитам в моей подписи ;)
     
  9. Bueno

    Bueno Активный пользователь

    С нами с:
    30 окт 2007
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Как раз немного было, слил :)