Как обновить данные в базе данных 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 в массив, чтобы потом выполнить апдейт пачкой. Не знаю на сколько это правильно, но пока больше не каких решений не приходит в голову. Прошу помощи!
