0

我想做一个排名网格。

我有一个由键索引的不同值的表:

表 SimpleValue : key varchar, value int, playerId int

我有一个有几个 SimpleValue 的播放器。

表播放器:id int,昵称 varchar

现在想象一下这些记录:

简单值:

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  

目前,我根据您要显示的 SimpleValue 键以及您要订购播放器的 SimpleValue 键生成一个 sql 查询。

例如:我想显示每个玩家的 '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 名玩家,我想显示 TOP 10,我使用 LIMIT 关键字。现在我想显示玩家 Bob 的排名,即 326/1000,我想在上面和下面显示 5 个排名玩家(所以从 321 到 331 的位置)。我怎样才能实现它?

谢谢。

4

1 回答 1

2

This is called a "Crosstab query". You can use conditional sum statements like this page

To get:

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
于 2010-04-23T17:38:45.803 回答