如何获取mysql中分组在一起的两列计数之间的比率(排行榜死亡/死亡比率)
我在pvp射击游戏中有一个排行榜,我想显示前20名玩家的杀/死比率(总杀数除以总死亡数) 我有一个记录杀戮的杀戮表,看起来像:如何获取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
| 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)。