如何为范围定义的标准优化复合选择?

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 列作为键连接的表中。名字在运动员表中,积分本身在积分表中。

以上是关于如何为范围定义的标准优化复合选择?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 biLSTM 层 Keras 设置自定义初始权重?

MySQL数据类型优化—整数类型优化选择

如何为具有复合主键的表构建外键?

如何为邻居访问优化 OpenCL 代码?

如何为 Laravel 优化超大数据的导入过程?

如何为一长串整数创建优化的迭代器?