如何为范围定义的标准优化复合选择?
Posted
技术标签:
【中文标题】如何为范围定义的标准优化复合选择?【英文标题】:How to have optimized compound select for a range defined criteria? 【发布时间】:2019-06-10 10:22:34 【问题描述】:我在代码中有两个选择,首先随机选择任意 20 名运动员
db.Query("SELECT sp_no, first_name FROM sportsmen LIMIT ?,20", rand.Intn(100000))
然后对于循环中的每个返回的运动员,从积分表中再次选择,在不同的比赛中公布他们的结果
db.Query("SELECT max(point) FROM points WHERE sp_no =" + spNo)
结果我有 20 名运动员,他们的名字和最高分数字。 我正在寻找这些选择的优化,以将它们组合成一个,以避免在代码中循环,然后测量性能。
如何有一个返回 first_name 及其最高点的 select 语句?
看起来像是组合复合选择、加入和存在验证?
谢谢。
【问题讨论】:
LIMIT
没有ORDER BY
没有意义。
想一想:mysql.rjweb.org/doc.php/random
【参考方案1】:
您可以将表表达式与第二个查询连接起来,如下所示:
select
x.sp_no, x.first_name, max(point) as max_points
from (
select sp_no, first_name
from sportsmend
order by sp_no
limit ?, 20
) x
join points p on p.sp_no = x.sp_no
group by x.sp_no, x.first_name
【讨论】:
【参考方案2】:我们可以尝试通过sp_no
聚合,随机排序:
SELECT s.sp_no, s.first_name, MAX(p.point) AS max_point
FROM sportsmen s
INNER JOIN points p
ON s.sp_no = p.sp_no
GROUP BY s.sp_no, s.first_name
ORDER BY RAND()
LIMIT 20;
请注意,这种方法完全可以直接在 MySQL 中处理所有繁重的工作。您的应用代码应该只需要执行上述查询并获取结果集。
【讨论】:
感谢您的评论。也许不清楚,数据在两个通过 sp_no 列作为键连接的表中。名字在运动员表中,积分本身在积分表中。以上是关于如何为范围定义的标准优化复合选择?的主要内容,如果未能解决你的问题,请参考以下文章