Mysql SQL计数两列并进行减法运算

Mysql SQL计数两列并进行减法运算,mysql,sql,group-by,unpivot,Mysql,Sql,Group By,Unpivot,晚安。我遇到了这个问题,我尝试了子查询和案例,但没有成功 当玩家在我的游戏中杀死某人时,会向数据库中添加一条新记录,该记录包含杀手的ID和被杀玩家的ID,因此一段时间后,表将如下所示: killer_id | death_id 100 | 200 -> (Player 100 Killed player 200) 100 | 200 100 | 200 200 | 100 300 | 100

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

当玩家在我的游戏中杀死某人时,会向数据库中添加一条新记录,该记录包含杀手的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查询上执行此操作,但我被卡住了。。。任何提示都将不胜感激。

您可以使用union all和aggregation:

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
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;
如果您还需要玩家排名,可以使用窗口函数,这需要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
您可以使用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
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;
如果您还需要玩家排名,可以使用窗口函数,这需要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
您可以使用“全部联合”和“聚合”:

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
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;
您可以使用“全部联合”和“聚合”:

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
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;

谢谢,我不是sql方面的专家,所以这对我帮助很大。谢谢,我不是sql方面的专家,所以这对我帮助很大。