簡體   English   中英

MySQL計算列滯后返回

[英]MySQL calculated column lagged return

我有一個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中。

UPDATE

這是更簡單的查詢,它沒有延遲地返回相同的結果(執行時間大致相同):

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上有一個索引,以便快速評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM