За последние 24 часа нас посетили 20665 программистов и 1109 роботов. Сейчас ищут 338 программистов ...

Удаление старых записей из таблицы mysql

Тема в разделе "PHP и базы данных", создана пользователем vanchester, 27 мар 2021.

  1. vanchester

    vanchester Новичок

    С нами с:
    24 янв 2021
    Сообщения:
    17
    Симпатии:
    0
    Такой запрос работает!
    <?
    php $link = mysql_connect("localhost", "user", "password");
    $rv = mysql_select_db(БД, $link);
    $sql = "TRUNCATE `test`.`data`";
    $query = mysql_query($sql);
    ?>

    Как сделать так, чтобы удалялись строки, которые старше 24 часов, но при этом оставалось строк не менее 5?

    Заранее благодарен!
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Для этого в таблице должна быть колонка с меткой времени добавления записи.
     
  3. vanchester

    vanchester Новичок

    С нами с:
    24 янв 2021
    Сообщения:
    17
    Симпатии:
    0
    Она имеется - date в виде 1616511743
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( NOW( ) ) - 86400
     
  5. vanchester

    vanchester Новичок

    С нами с:
    24 янв 2021
    Сообщения:
    17
    Симпатии:
    0
    Я прописал так:

    <?
    php $link = mysql_connect("localhost", "user", "password");
    $rv = mysql_select_db(БД, $link);
    $sql = "DELETE `test`.`data` FROM WHERE `date` < UNIX_TIMESTAMP( NOW( ) ) -86400";
    $query = mysql_query($sql);
    ?>

    не удаляет!!! Может я что то не так сделал?
     
  6. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Я не туда имя таблицы вставил. Потом отредактировал, но не успел, вы уже скопировали.
    И NOW() там лишняя
    Код (Text):
    1. DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( ) - 86400
     
  7. vanchester

    vanchester Новичок

    С нами с:
    24 янв 2021
    Сообщения:
    17
    Симпатии:
    0
    О, то что нужно! Огромное спасибо!
    А есть ли вариант, чтоб оставались последние 10 строк, даже если им более 24 часов (чтобы таблицу совсем не почистить)?
     
  8. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Запрашивайте записи за последние сутки отсортированных в обратном порядке.
    Потом отправляйте запрос на удаление всего, что меньше времени десятой записи. Если их десять и меньше. Или типа того.
     
  9. vanchester

    vanchester Новичок

    С нами с:
    24 янв 2021
    Сообщения:
    17
    Симпатии:
    0
    :eek::eek::eek: а как это прописать?
     
  10. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Отбой. По-другому надо.
    Непростая задачка, на логику.
    Не сегодня.
     
    #10 Drunkenmunky, 27 мар 2021
    Последнее редактирование: 27 мар 2021
  11. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    В таблице должна быть колонка с id типа int auto_increment
    Прежде, чем удалять, нужно получить id десятой записи
    Например так
    Код (Text):
    1. SELECT MAX( `id` ) -10
    2. FROM `test`.`data`
    Например в переменную $id
    А потом уже
    Код (Text):
    1. $sql = "DELETE FROM `test`.`data`
    2. WHERE `date` < UNIX_TIMESTAMP( ) - 86400
    3. AND `id` < $id";
    Как-то так.
    Одним запросом обойтись не получится, потому что нельзя обновлять данные получая в условии изменяемую переменную.
     
    #11 Drunkenmunky, 27 мар 2021
    Последнее редактирование: 27 мар 2021
  12. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    845
    Симпатии:
    129
    Откуда уверенность, что у записей id по порядку и отличаются на единичку друг от друга? )
     
  13. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
     
  14. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Самый просто вариант, это две таблички. И какой ни будь крон будет манипулировать данными по дате создания записей.
     
  15. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    Чего все усложняет то?, две таблицы, два запроса.... А про offset/limit все забыли?
     
  16. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    845
    Симпатии:
    129
    Где гарантия, что некоторые записи не были удалены вручную или по каким-то причинам не был сделан ALTER таблицы на автоинкремент?
     
  17. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Нет гарантии.
    Но если вы обратите внимание на пост, который вас заинтересовал, еще раз, то увидите там "например".
    Это слово означает, что 10-ую, 20, 30 и тд запись можно получить другим способом.
    Например же, с помощью ORDER BY и LIMIT

    Да.
     
  18. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    ну исходить из того, что за день новых записей создастся не более например миллиона))))) тогда все одним запросом
    Код (Text):
    1. DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( NOW( ) ) - 86400 LIMIT 10,1000000
    можно еще ORDER BY добавить чтоб например 10 это были самые "свежие"

    в какое место тут две таблицы собирались применять - непонятно....
     
  19. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Два момента.
    У DELET нет смещения, только лимит.
    NOW() лишний.
    https://dev.mysql.com/doc/refman/8.0/en/delete.html
     
  20. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.816
    Симпатии:
    735
    Адрес:
    Татарстан
    ну сделай вложенный запрос
    PHP:
    1. DELETE FROM t WHERE id IN(SELECT * .... LIMIT 10,100000000)
     
  21. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Нельзя из той же таблицы.
    Почему не помню, давно дело было.
    Либо в другую таблицу писать, желательно заранее, при добавлении например.
    Либо два запроса.
    Ну, или процедуру добавить. На INSERT и UPDATE
     
  22. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Ну, чтобы уже окончательно закрыть вопрос.
    Еще можно писать не в таблцу, а в переменную.
    Пример
    Код (Text):
    1. $sql = "SELECT `id` FROM `test`.`data`
    2. ORDER BY `test`.`id` DESC
    3. LIMIT 10 , 1 into @var;
    4. DELETE FROM `test`.`data`
    5. WHERE `date` < UNIX_TIMESTAMP( ) - 86400
    6. AND `id` < @var";
     
    don.bidon нравится это.