Отображение сетки рейтинга для игры: оптимизация левого внешнего соединения и поиск игрока - PullRequest
0 голосов
/ 23 апреля 2010

Я хочу сделать рейтинг сетки.

У меня есть таблица с различными значениями, проиндексированными ключом:

Таблица SimpleValue: ключ varchar, значение int, playerId int

У меня есть игрок с несколькими значениями SimpleValue.

Игрок стола: id int, ник varchar

Теперь представьте себе эти записи:

SimpleValue:

Key      value     playerId
for      1         1
int      2         1
agi      2         1
lvl      5         1

for      6         2
int      3         2
agi      1         2
lvl      4         2

Игрок:

id     nickname
1      Bob
2      John

Я хочу отобразить звание этих игроков на различных SimpleValue. Что-то вроде:

nickname      for       lvl     
Bob           1         5       
John          6         4  

На данный момент я генерирую SQL-запрос, основанный на том, какой ключ SimpleValue вы хотите отобразить, и на каком ключе SimpleValue вы хотите заказать игроков.

Например: я хочу отобразить 'lvl' и 'for' каждого игрока и заказать их на 'lvl'

Сгенерированный запрос:

SELECT p.nickname as nickname, v1.value as lvl, v2.value as for
FROM Player p
LEFT OUTER JOIN SimpleValue v1 ON p.id=v1.playerId and v1.key = 'lvl'
LEFT OUTER JOIN SimpleValue v2 ON p.id=v2.playerId and v2.key = 'for'
ORDER BY v1.value

Этот запрос выполняется отлично. НО, если я хочу отобразить 10 различных значений, он генерирует 10 «левое внешнее соединение». Есть ли способ упростить этот запрос?

У меня второй вопрос: есть ли способ отобразить часть этого рейтинга? Представьте, что у меня 1000 игроков, и я хочу отобразить ТОП 10, я использую ключевое слово LIMIT. Теперь я хочу отобразить ранг игрока Боба, который равен 326/1000, и я хочу отобразить 5 ранга игрока выше и ниже (т.е. от 321 до 331 позиции). Как мне этого добиться?

спасибо.

1 Ответ

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

Это называется «запрос кросс-таблицы». Вы можете использовать условные операторы сумм, как это page

Чтобы получить:

SELECT p.nickname as nickname
, SUM(IF(key = "for", value,0)) AS `for`
, SUM(IF(key = "int", value,0)) AS `int`
, SUM(IF(key = "agi", value,0)) AS `agi`
, SUM(IF(key = "lvl", value,0)) AS `lvl`
FROM Player p
LEFT OUTER JOIN SimpleValue v1 ON p.id=v1.playerId
GROUP By p.nickname
ORDER BY v1.value
...