gpt4 book ai didi

mysql - 如何将选择子查询重构为联接?

转载 作者:行者123 更新时间:2023-11-30 01:36:05 24 4
gpt4 key购买 nike

我有一个极其丑陋的复杂查询,它根据一系列分组返回比赛结果。

我有一个包含注册信息(姓名等)的表和一个包含完成时间的表。我需要为每个种族、类(class)和分区获得一个名额(它们是彼此的子组)。

我现在的工作是这样的:

Select reg.name, r.fin_time
( select count(*)+1 from
( Select temp_reg.id as regid, temp_reg.race_id as in_race, temp_res.division as in_div,
COALESCE(temp_res.fin_time, 9999999999) as finish_time
FROM results as temp_res Inner JOIN registration as temp_reg on temp_res.registration_id = temp_reg.id
WHERE COALESCE(temp_res.fin_time) > 0
AND temp_res.status ='Finished') as ahead_div
WHERE ahead_div.regid <> reg.registration_id
AND ahead_div.in_race = reg.race_id
AND ahead_div.in_div = r.division
AND ahead_div.finish_time < COALESCE(r.fin_time, 9999999999) ), '-') as fin_place_div,
... same for class and race...
FROM results as r inner join registration as reg on r.registration_id = reg.id
WHERE r.status = 'Finished';

所以我收集了所有完成比赛的选手,并统计他们在同一场比赛、同一组别中的位置,他们的完成时间是<该记录的完成时间。

我现在遇到一种情况,我需要将计算出的比赛终点显示为类(class)终点。所以我需要在 if 语句中复制比赛位置子查询(丑陋且缓慢),或者移动子查询到 where 子句,这样我就可以多次使用它们。

如何将选择中的“count() from subquery where”单值子查询重新格式化为联接?

有一些我可以重用内部子查询的东西吗?如果将类添加到其中,我可以从它的每个位置进行计数。

干杯,

最佳答案

我知道这不会帮助您的代码看起来更干净,但从性能角度来看,如果您只是重复使用相同的子查询,它可能会被缓存,因此不应该影响性能(通常只要它不影响性能) t 使用 session 变量或者是相关子查询)。

看看EXPLAIN EXTENDED所说的,只要它没有返回DEPENDENT SUBQUERYUNREACHABLE SUBQUERY,就不应该有性能命中。

SELECT
*
FROM
(SELECT a FROM a) b INNER JOIN
(SELECT a FROM a) c ON b.a = c.a

查询优化器应该缓存子查询,这样子查询就不会被实际检索两次。

关于mysql - 如何将选择子查询重构为联接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16878631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com