Такой запрос работает! <? php $link = mysql_connect("localhost", "user", "password"); $rv = mysql_select_db(БД, $link); $sql = "TRUNCATE `test`.`data`"; $query = mysql_query($sql); ?> Как сделать так, чтобы удалялись строки, которые старше 24 часов, но при этом оставалось строк не менее 5? Заранее благодарен!
Я прописал так: <? 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); ?> не удаляет!!! Может я что то не так сделал?
Я не туда имя таблицы вставил. Потом отредактировал, но не успел, вы уже скопировали. И NOW() там лишняя Код (Text): DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( ) - 86400
О, то что нужно! Огромное спасибо! А есть ли вариант, чтоб оставались последние 10 строк, даже если им более 24 часов (чтобы таблицу совсем не почистить)?
Запрашивайте записи за последние сутки отсортированных в обратном порядке. Потом отправляйте запрос на удаление всего, что меньше времени десятой записи. Если их десять и меньше. Или типа того.
В таблице должна быть колонка с id типа int auto_increment Прежде, чем удалять, нужно получить id десятой записи Например так Код (Text): SELECT MAX( `id` ) -10 FROM `test`.`data` Например в переменную $id А потом уже Код (Text): $sql = "DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( ) - 86400 AND `id` < $id"; Как-то так. Одним запросом обойтись не получится, потому что нельзя обновлять данные получая в условии изменяемую переменную.
Самый просто вариант, это две таблички. И какой ни будь крон будет манипулировать данными по дате создания записей.
Где гарантия, что некоторые записи не были удалены вручную или по каким-то причинам не был сделан ALTER таблицы на автоинкремент?
Нет гарантии. Но если вы обратите внимание на пост, который вас заинтересовал, еще раз, то увидите там "например". Это слово означает, что 10-ую, 20, 30 и тд запись можно получить другим способом. Например же, с помощью ORDER BY и LIMIT Да.
ну исходить из того, что за день новых записей создастся не более например миллиона))))) тогда все одним запросом Код (Text): DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( NOW( ) ) - 86400 LIMIT 10,1000000 можно еще ORDER BY добавить чтоб например 10 это были самые "свежие" в какое место тут две таблицы собирались применять - непонятно....
Два момента. У DELET нет смещения, только лимит. NOW() лишний. https://dev.mysql.com/doc/refman/8.0/en/delete.html
Нельзя из той же таблицы. Почему не помню, давно дело было. Либо в другую таблицу писать, желательно заранее, при добавлении например. Либо два запроса. Ну, или процедуру добавить. На INSERT и UPDATE
Ну, чтобы уже окончательно закрыть вопрос. Еще можно писать не в таблцу, а в переменную. Пример Код (Text): $sql = "SELECT `id` FROM `test`.`data` ORDER BY `test`.`id` DESC LIMIT 10 , 1 into @var; DELETE FROM `test`.`data` WHERE `date` < UNIX_TIMESTAMP( ) - 86400 AND `id` < @var";