Sql 显示游戏排名网格:优化左外连接并找到玩家

Sql 显示游戏排名网格:优化左外连接并找到玩家,sql,mysql,left-join,ranking,Sql,Mysql,Left Join,Ranking,我想做一个排名网格 我有一个表,其中有一个键索引的不同值: 表SimpleValue:key varchar、value int、playerId int 我有一个球员有几个简单的价值 桌面播放器:id int,昵称varchar 现在想象一下这些记录: SimpleValue: Key value playerId for 1 1 int 2 1 agi 2 1 lvl 5

我想做一个排名网格

我有一个表,其中有一个键索引的不同值:

表SimpleValue:key varchar、value int、playerId int

我有一个球员有几个简单的价值

桌面播放器: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关键字。现在我想显示玩家Bob的排名,是326/1000,我想显示上面和下面5个排名的玩家(从321位到331位)。我怎样才能做到呢

谢谢。

这称为“交叉表查询”。您可以像这样使用条件和语句

要获得:

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

您可以通过实体属性模式获得灵活性,但这会导致难以编写和优化查询。使用固定的表模式(其中属性只是表中的列,而不是行),这些查询会很容易。您不想添加一个
groupby
以使查询结果有意义吗?是的,我在发布后注意到了这一点。谢谢你。