2012-05-09 3 views
0

У меня есть список игроков в игре с рекордом. Я хочу получить свой балл, если мое имя «jimbo» и получить мою позицию в рейтинге и людей, которые находятся рядом со мной в рейтинге, 2 места лучше и 2 места хуже.рейтинг игры

CREATE TABLE `players` (
    `id` bigint(100) NOT NULL AUTO_INCREMENT, 
    `playername` varchar(15) NOT NULL, 
    `email` varchar(300) NOT NULL, 
    `highscore` bigint(100) NOT NULL, 
    PRIMARY KEY (`id`) 
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=106 ; 

ответ

1

Одним из способов достижения этой цели является использование временной таблицы:

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 в фактической таблице, которую вы будете обновлять, когда это имеет смысл для вашего приложения (я полагаю, это компромисс между производительностью и в реальном времени). Запрос, который вы затем использовали, может быть легко получен из вышеупомянутых, с той разницей, что вы не ограничены ограничениями временных таблиц, о которых я упоминал.

Смежные вопросы