首页 > 解决方案 > 如何获得mysql中组合在一起的两列的计数之间的比率(排行榜杀死/死亡比率)

问题描述

我在 pvp 射击游戏中有一个排行榜,我想显示前 20 名玩家,按他们的击杀/死亡比率排序(总击杀数除以他们的总死亡数)

我有一个杀死表来跟踪杀死,看起来像:

| killer_id | killed_id | date | 
| patrick   | jim       | 2021-03-01 |
| greyson   | jim       | 2021-03-02|
| jim       | patrick   | 2021-03-03|

我可以通过执行以下操作来获得总击杀数:

SELECT COUNT(*) as total_kills 
FROM kills 
GROUP BY killer_id 
ORDER BY total_kills DESC 
LIMIT 20

我可以通过执行以下操作来获得总死亡人数:

SELECT COUNT(*) as total_deaths 
FROM kills 
GROUP BY killed_id 
ORDER BY total_deaths DESC 
LIMIT 20

但是,我似乎无法将查询组合在一起,以便返回最佳比率列表。它看起来像:

| player_id | kill_death_ratio (total kills / total deaths) |
| patrick   | 2.1            |
| jim       | 1.0            |
| greyson   | .9            |

这甚至可以在单个查询中实现吗?

标签: mysqlgroup-bycount

解决方案


使用此查询:

SELECT killer_id player_id FROM kills UNION SELECT killed_id FROM kills

让所有玩家进入牌桌。
然后将它LEFT加入到您的查询中:

SELECT p.player_id, 
       COALESCE(t1.total_kills, 0) / t2.total_deaths kill_death_ratio
FROM (SELECT killer_id player_id FROM kills UNION SELECT killed_id FROM kills) p
LEFT JOIN (
  SELECT killer_id, COUNT(*) total_kills 
  FROM kills 
  GROUP BY killer_id 
) t1 ON t1.killer_id = p.player_id  LEFT JOIN (
  SELECT killed_id, COUNT(*) total_deaths 
  FROM kills 
  GROUP BY killed_id 
) t2 ON t2.killed_id = p.player_id

或者,没有您的疑问:

SELECT player_id, SUM(killer) / SUM(killed) kill_death_ratio
FROM (
  SELECT killer_id player_id, 1 killer, 0 killed
  FROM kills
  UNION ALL
  SELECT killed_id, 0, 1
  FROM kills
) t
GROUP BY player_id

请参阅演示
结果(对于您的样本数据):

player_id kill_death_ratio
吉姆 0.5
帕特里克 1.0
格雷森 无效的

请注意,您将获得null从未被杀死的玩家。


推荐阅读