Удалить из таблицы MySQL, где datetime старше, чем datetime другого элемента - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть некоторые трудности с правильным запросом MySQL.Текущий статус выглядит следующим образом:

  • У меня есть таблица, содержащая Todo, с полем datetime change_at (устанавливается на текущую дату и время при вставке / обновлении)

Я хочу построитьзапрос, который проверяет вставку / обновление:

  • , если существует более 20 элементов со значением is_checked, равным 1
  • , если да, удалите все элементы, которые старше этих 20 элементов

Дополнительная информация:

  • Структура таблицы: enter image description here

  • пример данных: enter image description here

Ожидаемым результатом такого запроса будет то, что все задачи с датой и временем поля 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. Он должен быть больше, чем первый параметр). Я думаю, что проблема этого запроса в том, что он долженвыполняться при каждом обновлении - это не кажется очень производительным.Есть идеи, как сделать это более эффективным?

...