mysql - 如何获得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 |
这甚至可以在单个查询中实现吗?
解决方案
使用此查询:
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
从未被杀死的玩家。
推荐阅读
- angular - 带有 ngx-restangular 的 Angular 通用(ssr 渲染)无法正常工作
- reactjs - How to add select all checkbox to list of checkboxes in react
- google-apps-script - 自动刷新 ImportXML Google 表格
- sockets - 将 HTTP 请求重定向/代理到辅助 HTTP 服务器
- c# - 在 UWP 应用中,读取命令行参数并将其从 App.xaml.cs 文件传递到 MainPage.xaml.cs
- javascript - JavaScript 是否有 maven/NuGet 等价物?
- python - 默认情况下是否需要Django模型表单以及如何将整个表单设置为false?
- python - 有没有更好的方法可以将计数函数应用于两组列表?
- c - 线程取消后程序卡住
- javascript - React - 使用多个 react-bootstrap 模式显示数据的正确方法