SQL и получение элементов вокруг конкретного - PullRequest
0 голосов
/ 10 июня 2011

Моя база данных sql хранит рекорды для игроков такой игры:

playerName
scores

Чтобы показать результаты, я пытаюсь создать запрос, который возвращает игроку "joe" позицию joe, а также одного игрока с большим и меньшим количеством очков, чем joe:

(rank) (playerName) (scores)
5000    luci       2001
5001    joe        1900
5002    marc       1750

(я добавил ранг здесь, чтобы сделать его более понятным. Он не сохраняется и представляет только позицию в списке при сортировке по баллам) Есть ли способ сделать что-то подобное с помощью запроса, не получив в результате половину базы данных?

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

В идеале вы хотели бы использовать оконные функции для этого, а именно row_number(), lead() и lag().

Они недоступны в MySQL, но вот aнесколько обходных путей (также row_number(), взятых от того же автора).


Использование оконных функций:

with
players as (
select row_number() over w as rank,
       playername,
       scores
from players
window w (order by scores desc)
),
player as (
select rank
from players
where playername = 'joe'
)
select rank,
       playername,
       scores
from players
join player on players.rank between player.rank - 1 and player.rank + 1

В качестве альтернативы (слегкабыстрее):

with
player_range as (
select scores - 100 as scores -- or whatever is large enough based on your stats
from players
where playername = 'joe'
),
players as (
select row_number() over w as rank,
       players.playername,
       players.scores
from players
join player_range
on player_range.scores <= players.scores
window w (order by scores desc)
),
player as (
select rank
from players
where playername = 'joe'
)
select rank,
       playername,
       scores
from players
join player on players.rank between player.rank - 1 and player.rank + 1
0 голосов
/ 10 июня 2011

Чтобы определить ранг Джо, вы должны запросить БД и порядок по баллам.

...