SQL查询以查找运行次数最多的玩家

Aak*_*yal 4 mysql

我有以下表格:

表 1 标题:运行

                    +------------+---------+
                    |    P_ID    |  Runs   |
                    +------------+---------+
                    |      1     | 100     |
                    |      2     | 45      |
                    |      3     | 35      |
                    |      1     | 90      |
                    |      2     | 85      |
                    +------------+---------+
Run Code Online (Sandbox Code Playgroud)

表 2 标题:球员

                    +------------+---------+
                    |    P_ID    |  Name   |
                    +------------+---------+
                    |    1       | Dhoni   |
                    |    2       | Sehawag |
                    |    3       | Sachin  |
                    |    4       | Dravid  |
                    |    5       | Kohli   |
                    +------------+---------+
Run Code Online (Sandbox Code Playgroud)

我必须找到运行总和最大的玩家名称。

我是 MySQL 的新手,无法找出正确/最有效的查询,请帮忙。

jka*_*lik 7

对于单独运行的表,求和将意味着每次读取整个表,因此为了性能,最好在某处预先计算总和,甚至在 Player 表中,定期(每天,每小时)或插入时更新/update 在 Runs 表中(触发器、ORM 事件或其他方式)。

但这对于您的情况可能是不可能的,因此查询以计算它们并找到最大值:

select
  sum(r.runs) total,
  r.p_id,
  p.name
from Runs r
join Player p using(p_id)
group by r.p_id
order by sum(r.runs) desc
limit 1;
Run Code Online (Sandbox Code Playgroud)

可以在http://sqlfiddle.com/#!9/27820/2看到实际操作

当两个玩家的最大值相同时,它会选择其中一个(可能是 p_id 较低的那个,但这不一定是真的)。如果不正常,请为此定义进一步的要求。

最好在 Runs 表中对 (p_id,runs) 进行索引,这样可以快速完成每个玩家的求和,但是为了找到最大值,仍然需要文件排序,因此如果您计划拥有数十万或数百万行在 Runs 表中,那么您可能真的想要预先计算它。

Players 表只需要 p_id 中的索引,这很容易满足,因为它是看起来很自然的主键。