Как сделать топ пользователей с выводом позиции текущего пользователя
нужно реализовать ТОП 100 пользователей по столбцу EXP и если текущий пользователь не входит в топ, то отдельно ниже вывести место текущего пользователя
Как вывести ТОП 100 это понятно:
$top = User::orderBy('exp', 'DESC')->select('name', 'exp')->limit(100)->get();
И если мы знаем место текущего пользователя, то можно проверить, оно больше 100 или меньше, если больше, то мы выводим текущего пользователя с его местом под ТОП 100, если меньше, то в foreach перебираем полученный список, находим пользователя и выделяем его.
Проблема заключается в том, что я не понимаю как высчитать место текущего пользователя
В принципе можно добавить новый столбец place в таблицу users и например раз в час перебирать всех пользователей(отсортировать по exp desc) и сохранять текущую позицию в поле place
Но что делать если пользователей будет свыше 1мл, тогда перебрать всех пользователей и у каждого изменить place будет слишком затратно
Ответы (1 шт):
Можно завернуть вот такой запрос (основано на SQL Find Position in table):
SELECT tt.*
FROM
(
SELECT
id,
name,
exp,
(@rownum := @rownum + 1) UserRank
FROM users, (SELECT @rownum := 0) t
ORDER BY exp DESC
) tt
WHERE tt.id = 4
Ну или просто посчитать количество пользователей, которые выше (у которых экспы больше, чем у текущего пользователя):
SELECT count(*)
FROM users
WHERE exp >= 100500
ORDER BY exp DESC
Если нужно диапазон позиции (если у многих экспа совпадает), то предыдущий запрос выполняем дважды с > и >=.