Как обновить данные в базе данных mysql?

Встала задача обновить статусы строк в бд, если время регистрации или время конца квеста вышло (меньше текущего) Время регистрации и время действия квеста, задается в админке, и может быть любым (к примеру, завершить квест или регистрацию в 2021:08:15 18:13:13)

введите сюда описание изображения

Как все работает сейчас: Задача по крону запускается раз в минуту и содержит два запроса на апдейт с условием просрочки времени, и если время вышло, меняет статусы на противоположные.

$query = "SET @salt_quest = (SELECT MAX(salt_quests) FROM repository_quests);";
$result = dbUpdate($query);

// Смотрим когда регистрация закончится (NOW() >= registration_date_quests) и обновляем статусы
$query = "UPDATE repository_quests SET status_game_quests = 1, status_progress_registration_quests = 0, salt_quests = @salt_quest:= @salt_quest + 1
              WHERE status_accessibility_quests = 1 
                  AND status_active_quests = 1 
                  AND status_game_quests = 0 
                  AND status_includes_registration_quests = 1 
                  AND status_progress_registration_quests = 1 
                  AND NOW() >= registration_date_quests;";
  $result = dbUpdate($query);

// Смотрим когда квест закончится (NOW() >= rq.duration_date_quests) и обновляем статусы
  $query = "UPDATE repository_quests AS rq
  JOIN players_registered_for_quests AS pq ON rq.id = pq.id_quest
  JOIN data_progress_game_quests AS dq ON dq.id = pq.id_quest
  SET 
  rq.status_game_quests = 0, 
  rq.status_progress_registration_quests = 1, rq.duration_date_quests = DATE_ADD(NOW(), INTERVAL rq.duration_time_hour_quests + rq.registration_time_hour_quests HOUR), rq.registration_date_quests = DATE_ADD(NOW(), INTERVAL rq.registration_time_hour_quests HOUR),
  pq.players_data = NULL,
  dq.data_quest = NULL
  WHERE 
  rq.status_accessibility_quests = 1 AND 
  rq.status_active_quests = 1 AND 
  rq.status_game_quests = 1 AND 
  rq.status_includes_registration_quests = 1 AND
  rq.status_progress_registration_quests = 0 AND 
  NOW() >= rq.duration_date_quests;";
  $result = dbUpdate($query);

Но теперь встала задача, не просто обновлять статусы, а перед обновлением статуса у конкретного квеста, сделать доп манипуляции (выполнить функции по id квеста) и когда все выполнится, только тогда обновить статус. И так нужно делать по каждому квесту.

Были мысли раз в минуту кроном грузить все квесты и дергать от туда даты завершения регистрации или квеста, и проверять дату из бд и дату с php, если просрочено, то мы будем знать id квеста, и можем провести манипуляции, и далее закинуть id в массив, чтобы потом выполнить апдейт пачкой. Не знаю на сколько это правильно, но пока больше не каких решений не приходит в голову. Прошу помощи!


Ответы (0 шт):