如何获取mysql中分组在一起的两列计数之间的比率(排行榜死亡/死亡比率)

如何获取mysql中分组在一起的两列计数之间的比率(排行榜死亡/死亡比率),mysql,group-by,count,Mysql,Group By,Count,我在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

我在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
我可以通过以下方式获得总的死亡人数:

| 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
我可以通过这样做得到总死亡人数:

| 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            |
这在单个查询中是否可行?

使用此查询:

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
或者,没有您的疑问:

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
请参阅。
结果(针对您的样本数据):

玩家id 致死率 吉姆 0.5 帕特里克 1 格雷森 无效的
某些玩家的总死亡人数可能为0。在这种情况下你希望得到什么结果?难以置信。非常感谢。我的kills表上有近300k行,所以运行大约需要10秒,所以看起来需要缓存结果或采用不同的方法,但我学到了一些东西。仅供参考,如果你从未死过,我希望这个比率仅仅是死亡人数,所以我使用COALESCE()在返回null的情况下返回总和(killer)。