Одним из способов достижения этой цели является использование временной таблицы:
CREATE TEMPORARY TABLE ranked_players AS
SELECT id, playername, @rownum:[email protected]+1 AS rank
FROM players
JOIN (SELECT @rownum:=0) AS RANK
ORDER BY highscore DESC;
Вы можете добавить id
или playername
, если вы хотите, чтобы обеспечить последовательное упорядочение игроков с тем же highscore
,
Теперь вам нужно выяснить ранг для игрока (обратите внимание, что MySQL не позволит вам дважды использовать временную таблицу в одном запросе, поэтому это невозможно поместить в подзапрос следующего оператора):
SELECT rank
INTO @myrank
FROM ranked_players
WHERE playername = 'jimbo';
Тогда вы будете хотеть, чтобы получить круг игроков с рангом от 2 места до 2 места вниз:
SELECT players.*
FROM players
JOIN ranked_players USING (id)
WHERE rank BETWEEN (@myrank - 2) AND (@myrank + 2)
ORDER BY highscore DESC;
Затем очистки временной таблицы:
DROP TEMPORARY TABLE ranked_players;
Наконец, вы можете уменьшить это до одного запроса, если вы предварительно вычислили список пользователей с rank
в фактической таблице, которую вы будете обновлять, когда это имеет смысл для вашего приложения (я полагаю, это компромисс между производительностью и в реальном времени). Запрос, который вы затем использовали, может быть легко получен из вышеупомянутых, с той разницей, что вы не ограничены ограничениями временных таблиц, о которых я упоминал.