代码之家  ›  专栏  ›  技术社区  ›  Jerome Cance

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

  •  0
  • Jerome Cance  · 技术社区  · 16 年前

    我想做一个排名网格。

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

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

    牌手: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  
    

    例如:我想显示每个玩家的“等级”和“for”,并在“等级”上订购它们

    生成的查询是:

    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
    

    我还有第二个问题:有没有办法显示这个排名的一部分。假设我有1000名玩家,我想显示前10名,我使用LIMIT关键字。现在我想显示玩家Bob的等级是326/1000,我想显示上面和下面的5个等级的玩家(从321到331的位置)。我怎样才能做到呢?

    谢谢。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Dan    16 年前

    这称为“交叉表查询”。您可以使用这样的条件和语句 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