SQL считать два столбца и вычитать - PullRequest
1 голос
/ 19 марта 2020

Спокойной ночи. У меня возникла эта проблема, я попытался выполнить подзапросы и дело безуспешно.

Когда игрок убивает кого-то в моей игре, новая запись добавляется в базу данных, эта запись содержит идентификатор убийцы и идентификатор убитый игрок, поэтому через некоторое время стол будет выглядеть следующим образом:

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 запросе, но я застрял ... любой совет был бы оценен.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы можете использовать 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
1 голос
/ 19 марта 2020

Вы можете использовать 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;
...