gpt4 book ai didi

php - MySQL 计算列滞后返回

转载 作者:行者123 更新时间:2023-11-29 03:05:19 24 4
gpt4 key购买 nike

我有一个包含计算列的 MySQL 查询。

由于某种原因,在第一次运行时,查询在计算列中返回 NULL。在刷新(即第二次运行)时,它会正确返回计算值。我怎样才能摆脱这种滞后?

请看下面的查询:

SELECT @P0:=MAX(CASE WHEN t2.date IS NULL THEN t1.price ELSE NULL END),

@P1:=MAX(CASE WHEN t3.date IS NULL THEN t1.price ELSE NULL END),

ROUND(100*(@P1-@P0)/@P0,1) AS 'r1y'
/* The r1y above is the calculated column that is returned with lag*/

FROM (SELECT date, price FROM mytable
WHERE ticker='XYZ'
AND date>=@t1:=(SELECT DATE_SUB((SELECT MAX(date) FROM mytable),
INTERVAL 1 YEAR))) AS t1

LEFT OUTER JOIN (SELECT date FROM mytable
where ticker='XYZ'
AND date>=@t1) AS t2
ON (t1.date>t2.date)

LEFT OUTER JOIN (SELECT date FROM mytable
WHERE ticker='XYZ'
AND date>=@t1) AS t3
ON (t1.date<t3.date)

当我将“r1y”的计算从 MySQL 移到代码的 PHP 部分时,当然没有延迟。尽管如此,如果所有计算都在 MySQL 中进行,那将是一件好事。

更新

下面是更简单的查询,它返回相同的结果且没有延迟(执行时间大致相同):

SELECT 
@d1:=(SELECT MAX(date) FROM mytable WHERE ticker='XYZ' AND current=1),
@d2:=(SELECT MIN(date) FROM mytable WHERE ticker='XYZ'
AND date>=DATE_SUB(@d1, INTERVAL 1 YEAR)),
@m1:=(SELECT price FROM mytable WHERE ticker='XYZ' AND date=@d1),
@m2:=(SELECT price FROM mytable WHERE ticker='XYZ' AND date=@d3),
ROUND(100*(@m1-@m2)/@m2, 1) as r1y

了解上述延迟的性质仍然是件好事,但这个建议的解决方案对我来说效果很好。

最佳答案

您在这里设置@t1 的值:

FROM (SELECT date, price
FROM mytable
WHERE ticker='XYZ' AND
date>=@t1:=(SELECT DATE_SUB((SELECT MAX(date) FROM mytable
), INTERVAL 1 YEAR
)
)
) AS t1

然后您将在后续子查询中使用它。

SQL 保证连接处理顺序。 MySQL 也没有。您的查询第一次不工作的原因是第一个子查询没有首先执行。

可能最简单的修复方法是在原始查询的每个部分重复子查询——但要确保在 date 上有一个索引,以便它的计算速度非常快。

关于php - MySQL 计算列滞后返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16497830/

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