@speculant

Топ пользователей, и вывод текущего места в профиле, как правильно реализовать в MYSQL + PHP?

Здравствуйте, хочу сделать топ пользователей и отображение позиции пользователя в профиле, в четырех разных рейтингах. Имеется база данных и в ней столбец очков и остальных параметров пользователей. Данные пользователя обновляются при открытии страницы с интервалом в час, данные пользователей из топ 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 дополнительных таблицы для каждого вида рейтинга и как правильно получать текущее место пользователя.
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 2
@RainbowPower
Реализаций тонна, одна из них, создай таблицу в которой будет user_id, score1, score2, score3, score4 и записывай рейтинг в соответствующие поля.
SELECT * FROM table ORDER BY score DESC LIMIT 30 это подойдет.
Индивидуальное место пользователя - смотришь id текущего юзера, ищешь запись по полю user_id и вытаскиваешь необходимый рейтинг.
Ответ написан
@miki131
Место в рейтинге это количество записей у которых score меньше
SELECT COUNT(*) FROM table WHERE score < ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
SaveTime Москва
от 140 000 до 200 000 руб.
Интерно Ростов-на-Дону
от 35 000 до 50 000 руб.
23 янв. 2019, в 09:01
2500 руб./за проект
23 янв. 2019, в 08:56
1500 руб./в час
23 янв. 2019, в 08:50
10000 руб./за проект