Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL计算列滞后返回_Php_Mysql_Lag_Calculated Columns - Fatal编程技术网

Php MySQL计算列滞后返回

Php MySQL计算列滞后返回,php,mysql,lag,calculated-columns,Php,Mysql,Lag,Calculated Columns,我有一个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-@

我有一个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)

了解上述滞后的性质仍然很好,但建议的解决方案对我来说效果很好。

您在此处设置@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
上有一个索引,因此它的计算速度非常快。

试试看:不要使用准备好的语句,而是使用别名。如下所示:选择MAX(t2.date为空,t1.price-ELSE为空)作为P0,MAX(t3.date为空,t1.price-ELSE为空,P1)作为P1,ROUND(100*(P1-P0)/P0,1)作为'r1y'谢谢@bouscher,不幸的是这不起作用(返回了一个错误)。谢谢戈登,这现在有意义了!
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