【发布时间】:2013-05-06 01:22:21
【问题描述】:
我有一个 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
了解上述延迟的性质仍然很好,但这个建议的解决方案对我来说很好。
【问题讨论】:
-
试一试:不要使用准备好的语句,而是使用别名。像这样:SELECT MAX(CASE WHEN t2.date IS NULL THEN t1.price ELSE NULL END) AS P0, MAX(CASE WHEN t3.date IS NULL THEN t1.price ELSE NULL END) AS P1, ROUND(100*(P1 -P0)/P0,1) AS 'r1y'
-
感谢@bouscher,不幸的是这不起作用(返回错误)。
标签: php mysql lag calculated-columns