Здравствуйте, хочу сделать топ пользователей и отображение позиции пользователя в профиле, в четырех разных рейтингах. Имеется база данных и в ней столбец очков и остальных параметров пользователей. Данные пользователя обновляются при открытии страницы с интервалом в час, данные пользователей из топ 30 обновляются каждые час - пол часа.
На странице топа я просто буду выводить
SELECT * FROM table ORDER BY score DESC LIMIT 30
Средствами sql можно задавать им места? или просто в php в цикле при выводе присваиваем место? Или при обновлении позиций, записывать все 4 позиции в отдельные столбцы и потом по ним выводить, хотя это можно и сделать просто сортировкой с нужным условием.
На странице пользователя должно выводиться его текущее место в рейтинге. Рейтингов несколько (общий, среди определенной группы и тд).
Когда заходишь на страницу (если данные не обновлялись в течении часа) происходит обновление данных (в отдельной для каждого рейтинга таблице, всего их 4), подсчет новой позиции, вывод позиции и обновление общей таблицы.
$stmt = $conn->prepare('UPDATE rating_all SET score=? WHERE nick=?');
$stmt ->execute([$score, $nick]);
//затем обновление текущих позиций
$stmt2 = $conn->query('SET @rank=0');
$stmt3 = $conn->query('UPDATE rating_all SET rank= @rank:= (@rank+1) ORDER BY score DESC');
//Получение новой позиции
$stmt4 = $conn->prepare('SELECT rank FROM rating_all WHERE nick = ?');
$stmt4 ->execute([$nick]);
while($row = $stmt4->fetch(PDO::FETCH_ASSOC)) {
$rank = $row['rank']; // так вообще нормально делать? или как получить значение по другому
}
//И дальше идет обновление данных в общей таблице
$stmt = $conn->prepare('UPDATE rating SET ...') ;
Как будет правильнее реализовать этот функционал, нужно ли заводить 4 дополнительных таблицы для каждого вида рейтинга и как правильно получать текущее место пользователя.