Display a ranking grid for game : optimization of left outer join and find a player
Posted
by Jerome C.
on Stack Overflow
See other posts from Stack Overflow
or by Jerome C.
Published on 2010-04-23T17:26:28Z
Indexed on
2010/04/23
17:33 UTC
Read the original article
Hit count: 299
Hello,
I want to do a ranking grid.
I have a table with different values indexed by a key:
Table SimpleValue : key varchar, value int, playerId int
I have a player which have several SimpleValue.
Table Player: id int, nickname varchar
Now imagine these records:
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
Player:
id nickname
1 Bob
2 John
I want to display a rank of these players on various SimpleValue. Something like:
nickname for lvl
Bob 1 5
John 6 4
For the moment I generate an sql query based on which SimpleValue key you want to display and on which SimpleValue key you want to order players.
eg: I want to display 'lvl' and 'for' of each player and order them on the 'lvl'
The generated query is:
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
This query runs perfectly. BUT if I want to display 10 different values, it generates 10 'left outer join'. Is there a way to simplify this query ?
I've got a second question: Is there a way to display a portion of this ranking. Imagine I've 1000 players and I want to display TOP 10, I use the LIMIT keyword. Now I want to display the rank of the player Bob which is 326/1000 and I want to display 5 rank player above and below (so from 321 to 331 position). How can I achieve it ?
thanks.
© Stack Overflow or respective owner