【问题标题】: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 语句?

看起来像是组合复合选择、加入和存在验证?

谢谢。

【问题讨论】:

标签: mysql sql select query-optimization nested-queries


【解决方案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 列作为键连接的表中。名字在运动员表中,积分本身在积分表中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2019-12-23
    • 2016-01-07
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多