За последние 24 часа нас посетили 19015 программистов и 1614 роботов. Сейчас ищут 644 программиста ...

Удалять записи, пока не останется определенное кол-во записе

Тема в разделе "MySQL", создана пользователем Till483, 2 июн 2013.

  1. Till483

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

    С нами с:
    18 ноя 2011
    Сообщения:
    15
    Симпатии:
    0
    Здравствуйте. Нужно удалить записи в таблице, но чтобы осталось не меньше определенного кол-ва записей (к примеру, чтобы осталось не менее 500). На ум приходит рекурсивная функция, которая будет каждый раз считать кол-во строк в таблице, и если больше ограничительного числа - то делать удаление. А можно как-то сделать одним запросом? Спасибо.
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Удалять записи, пока не останется определенное кол-во за

    Не пробовал может бред, но все же :)

    Delete поддерживает ORDER и LIMIT.

    Сделай OREDER в нужном направлении и затем LIMIT 500

    Добавлено спустя 19 секунд:
    Re: Удалять записи, пока не останется определенное кол-во записе
    Получится 1 запрос
     
  3. Till483

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

    С нами с:
    18 ноя 2011
    Сообщения:
    15
    Симпатии:
    0
    Re: Удалять записи, пока не останется определенное кол-во за

    Это не то. LIMIT просто удалит определенное кол-во, не считаясь с кол-вом, которое осталось. ORDER не не поможет.
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Удалять записи, пока не останется определенное кол-во за

    Ну это уже мои рассуждения...
    Можно попробовать первым запросом получить общее количество строк.Отнять 500 т.е. узнать сколько строк удалять.
    Затем как я описал выше order и limit удалит не нужные строки.Останется 500.
    Что б одним запросом, тут я думаю процедуру сделать надо...
    Может кто то лучше посоветует...
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Удалять записи, пока не останется определенное кол-во за

    Стало интересно написал процедуру

    Код (Text):
    1.  
    2. DELIMITER //
    3. CREATE PROCEDURE delete_records(IN records INT)
    4. BEGIN
    5.    DECLARE total_records INT;
    6.    SELECT COUNT(*) - records INTO total_records FROM table_name;
    7.    
    8.    IF total_records > 0 THEN
    9.    DELETE FROM table_name ORDER BY id ASC LIMIT total_records;  
    10.    END IF;
    11. END;
    В процедуру передается количество записей которое должно остаться в базе, дальше думаю разберешь :)
     
  6. Till483

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

    С нами с:
    18 ноя 2011
    Сообщения:
    15
    Симпатии:
    0
    Re: Удалять записи, пока не останется определенное кол-во за

    Точно, первым запросом буду считать кол-во строк и вычитать, полученное число вставлять в LIMIT в запрос удаления. Спасибо)
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Удалять записи, пока не останется определенное кол-во за

    хз, я б выбрал 500 айдишников, а остальные удалил бы запросом с условием where id not in (айдишники через запятую)
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Удалять записи, пока не останется определенное кол-во за

    Till483 если не сложно проверь оба варианта, интересно что быстрее
     
  9. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Re: Удалять записи, пока не останется определенное кол-во за

    DELETE ... NOT IN (список чего оставить)

    приходит в голову буквально такое, но оно невозможно в силу ограничений MySQL, limit и in несовместимы!
    Код (Text):
    1. DELETE FROM xxx
    2. WHERE `id` NOT IN (
    3.   SELECT `id`
    4.   FROM `xxx`
    5.   WHERE условие_чего_оставить
    6.   ORDER BY `z`
    7.   LIMIT 500)
    Error: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    зато разрешено обернуть внутренний подзапрос в еще один select и тогда сработает! :)))
    Код (Text):
    1. DELETE FROM `xxx`
    2. WHERE `id` NOT IN (
    3.   SELECT `id` FROM (
    4.      SELECT `id`
    5.      FROM `xxx`
    6.      WHERE условие_чего_оставить
    7.      ORDER BY `z`
    8.      LIMIT 500
    9.   ) AS t)
    проверено! кстати не я это придумал
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Re: Удалять записи, пока не останется определенное кол-во за

    гыгы
     
  11. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Re: Удалять записи, пока не останется определенное кол-во за

    ахуеть! )))
     
  12. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Re: Удалять записи, пока не останется определенное кол-во за

    Жалко что Till483 молчит а то самому как то лень проверять...
     
  13. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    Re: Удалять записи, пока не останется определенное кол-во за

    спасибо добрый человек. только вот понадобилось удалить из таблицы данные с подзапросом из этой же таблицы. и вспомнил, что на днях читал о такой проблеме)