【问题标题】:Adjusting MySQL ranking query调整 MySQL 排名查询
【发布时间】:2014-08-27 08:48:09
【问题描述】:

我正在尝试从我拥有的匹配表中获取排名列表。 matches 表中的每一行代表已进行的一场比赛,包括赢家和输家。排名应基于特定玩家累积的胜利次数。我目前有一个查询根据获胜次数对玩家进行排名,但它排除了获胜次数为 0 的玩家。

如何调整我的查询,以使结果中包含 0 胜的玩家?我是否可以考虑损失,以便根据失败次数对 0 胜的玩家进行排名?

所有相关信息如下。谢谢。

matches表:

winner   |   loser   |    winner_score   |   loser_score
--------------------------------------------------------
Jason    |   Alex    |         15        |       13
Bill     |   Jason   |         14        |       11
Alex     |   Bill    |         12        |        6
Jason    |   Scott   |         13        |        8

我当前的查询:

SELECT t1.player, 
   (SELECT Count(*) 
    FROM   (SELECT Count(*) AS wins, 
                   winner   AS player 
            FROM   matches 
            GROUP  BY winner 
            ORDER  BY wins DESC) t2 
    WHERE  t2.wins > t1.wins) 
   + 1 AS rank, 
   t1.wins 
FROM   (SELECT Count(*) AS wins, 
           winner   AS player 
    FROM   matches 
    GROUP  BY winner 
    ORDER  BY wins DESC) t1 

我目前的结果:

player   |   rank  |    wins
------------------------------
Jason    |    1    |     2
Bill     |    2    |     1
Alex     |    2    |     1

我想要的结果:

player   |   rank  |    wins   |   losses
---------------------------------------------
Jason    |    1    |     2     |     1
Bill     |    2    |     1     |     1
Alex     |    2    |     1     |     1
Scott    |    3    |     0     |     1

【问题讨论】:

  • 玩家只能互相玩一次吗?
  • 不,他们可以互相玩不止一次
  • 在这种情况下,您没有主键。这可能有问题。
  • 也许我疯了,但我觉得如果您将用户从匹配表中分离出来,而是使用他们的 id,则可以更轻松地进行管理。

标签: mysql sql


【解决方案1】:

看似复杂,其实并不复杂:)

  • sqlfiddle 中实时查看它的工作情况

select player, wins, losses, rank from (

    select ssq.*, 
    @rank := if(@prev_win = wins, @rank, @rank + 1) as rank,
    @prev_win := wins
    from (

        select
        player,
        sum(won=1) as wins,
        sum(won=0) as losses
        from (

            select
            winner as player,
            1 as won
            from
            Table1
            union all
            select
            loser as player,
            0 as won
            from 
            Table1

        ) sq
        group by player

    ) ssq
    , (select @rank := 0, @prev_win := null) var_init
    order by wins desc, wins-losses asc

) sssq

【讨论】:

  • 那些排名在我看来是倒退的。它显示斯科特以 0 胜 1 负排名第一。
  • 糟糕,需要order by wins desc 而不是隐含的asc。解决了这个问题。
  • 我怀疑我们在某个地方需要 SUM(wins-losses)。
  • 为什么?它得到与问题中所需结果相同的输出。
  • @fancyPants 因为有 2 个用户目前排名第二。一般来说,分数差异将决定谁是第二名,谁是第三名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 2020-05-26
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多