У меня есть некоторые трудности с правильным запросом MySQL.Текущий статус выглядит следующим образом:
- У меня есть таблица, содержащая Todo, с полем datetime change_at (устанавливается на текущую дату и время при вставке / обновлении)
Я хочу построитьзапрос, который проверяет вставку / обновление:
- , если существует более 20 элементов со значением is_checked, равным 1
- , если да, удалите все элементы, которые старше этих 20 элементов
Дополнительная информация:
Структура таблицы:
пример данных:
Ожидаемым результатом такого запроса будет то, что все задачи с датой и временем поля created_at
старше, чем самые новые 20 (или x)элементы удалены.
Я немного застрял здесь, потому что это, кажется, более сложный запрос.Я уже прочитал документы MySQL о функциях даты и времени, но я не понимаю, как этого добиться.Кто-нибудь может помочь?
Я попробовал это с этим:
DELETE FROM todos WHERE todo_id IN
(SELECT todo_id FROM
(SELECT todo_id FROM todos
WHERE list_id = :list_id
AND is_checked = :is_checked
order by created_at ASC LIMIT 20
) a
)
Но это удаляет самые старые 20 записей - это не совсем то, что я хочу.
РЕДАКТИРОВАТЬ: Этокажется рабочим запросом:
$sql = "DELETE FROM todos WHERE todo_id IN
(SELECT todo_id FROM
(SELECT todo_id FROM todos
WHERE list_id = :list_id
AND is_checked = :is_checked
order by created_at DESC LIMIT 15, 50
) a
)";
(нужен был второй параметр в предложении LIMIT. Он должен быть больше, чем первый параметр). Я думаю, что проблема этого запроса в том, что он долженвыполняться при каждом обновлении - это не кажется очень производительным.Есть идеи, как сделать это более эффективным?