【问题标题】:SQL count two columns and substractSQL计算两列并减去
【发布时间】:2020-03-19 00:04:16
【问题描述】:

晚安。我遇到了这个问题,我尝试了子查询和案例没有成功。

当玩家在我的游戏中杀死某人时,会在数据库中添加一条新记录,该记录包含杀手的 ID 和被杀死的玩家的 ID,所以一段时间后表格将如下所示:

killer_id  |  death_id
100        |  200        -> (Player 100 Killed player 200)
100        |  200
100        |  200
200        |  100
300        |  100
300        |  200

我试图得到每个玩家的分数,基于他们的杀戮减去他们的死亡,所以基于上述数据:

Rank:
Pos 1. player 300 / 2 Points  (2 Kills - 0 deaths)
Pos 2. player 100 / 1 Point   (3 Kills - 2 deaths)
Pos 3. player 200 / -3 Points (1 Kills - 4 deaths)

我想在一个 SQL 查询上执行此操作,但我被卡住了……任何提示都将不胜感激。

【问题讨论】:

    标签: mysql sql group-by unpivot


    【解决方案1】:

    您可以使用union all 和聚合:

    select player_id, sum(cnt) score
    from (
        select killer_id player_id, 1 cnt from mytable
        union all select death_id, -1 from mytable
    ) t
    group by player_id
    order by score desc
    

    如果你还想要玩家排名,可以使用窗口函数(这需要 MySQL 8.0):

    select rank() over(order by sum(cnt) desc) pos, player_id, sum(cnt) score
    from (
        select killer_id player_id, 1 cnt from mytable
        union all select death_id, -1 from mytable
    ) t
    group by player_id
    order by score desc
    

    【讨论】:

    • 谢谢,我不是 sql 专家,所以这对我帮助很大。
    【解决方案2】:

    您可以使用union all 和聚合:

    select player_id, sum(points)
    from ((select killer_id as player_id, 1 as points
           from t
          ) union all
          (select death_id, -1 as points
           from t
          ) 
         ) kd
    group by player_id
    order by sum(points) desc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多