Как сформировать оптимальный запрос, чтобы получить высокие баллы из базы данных? - PullRequest
3 голосов
/ 12 апреля 2010

Я использую базу данных MySQL для хранения результатов своей игры. Очень упрощенная версия таблицы будет

(PlayerID - int) (Имя - строка) (Оценка - int)

Я хотел бы сформировать запрос, который вернул бы мне набор, скажем, 10 результатов, где интересующий игрок находится в середине таблицы.

Возможно, пример прояснит ситуацию.

Я только что набрал высокий балл, меня зовут Стив. Когда я смотрю на таблицу рекордов, я хотел бы видеть 5 баллов ниже меня и 5 баллов выше меня. Очевидно, что если у меня будет самый высокий балл, я увижу 9 баллов ниже себя, и, наоборот, если я снизу, я увижу 9 баллов выше меня. Таблица баллов может состоять из тысяч баллов.

Поскольку база данных специально предназначена для запросов к наборам данных, я бы хотел уменьшить объем последующей обработки результатов.

У кого-нибудь есть идея для запроса, чтобы достичь этого?

Спасибо Рич

1 Ответ

2 голосов
/ 12 апреля 2010

если у вас есть идентификатор пользователя и оценка (userId и userScore), вы можете сделать:

SELECT * FROM Scores 
WHERE PlayerID = userId
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score > userScore ORDER BY Score LIMIT 5)
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score < userScore ORDER BY Score DESC LIMIT 5)
ORDER BY Score

РЕДАКТИРОВАТЬ : следуя вашим комментариям: Прежде всего, вам нужно знать рейтинг текущего пользователя. Вы можете узнать это с помощью такого запроса, как SELECT COUNT(*) FROM Scores WHERE Score > userScore
Это дает вам число n
Затем вы вычисляете два числа usersUp и usersDown, например usersDown + userUp = 10 и n - userUp> 0 и n + usersDown

SELECT * FROM Scores WHERE PlayerID = userId
UNION
SELECT * FROM Scores WHERE Score > userScore ORDER BY Score LIMIT usersUp
UNION 
(SELECT * FROM Scores WHERE Score < userScore ORDER BY Score LIMIT usersDown)

если вы хотите остаться на стороне сервера MySQL, вы можете собрать все это в хранимой процедуре

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...