我有以下表格:
表 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 的新手,无法找出正确/最有效的查询,请帮忙。
对于单独运行的表,求和将意味着每次读取整个表,因此为了性能,最好在某处预先计算总和,甚至在 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 中的索引,这很容易满足,因为它是看起来很自然的主键。
归档时间: |
|
查看次数: |
16489 次 |
最近记录: |