2010-02-24 43 views
2

我有一個查詢,其中有一個複雜的日期表達式作爲其中一列。在where子句中引用複雜表達式值

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 

我想指的是列在where子句

WHERE complex_date_calculation < NOW() 

在然而MySQL扼流圈就可以了。要做到這一點

1054: Unknown column 'complex_date_calculation' in 'where clause' 

的方法之一是把它包在一個子選擇

SELECT * FROM ( 
    SELECT 
     date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
    FROM table 
) AS alias 
WHERE complex_date_calculation < NOW() 

這是最好的辦法嗎?

我也可以重新在WHERE子句中進行計算,但這似乎是愚蠢的。爲什麼數據庫要計算兩次這個日期?或者,優化器會存儲該值嗎?

回答

2

我要的是HAVING

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 
HAVING complex_date_calculation < NOW() 
+0

在我而言,我不得不同時使用「在哪裏」,也該「有」。它的工作完美:) – 2017-02-10 10:19:32

0

爲了獲得最佳性能,則應該索引date_column和移動計算到比較器的where子句中的另一側,像這樣:

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 
WHERE date_column < NOW() - INTERVAL(complex_jimmy_jam) DAY 

這種方式上date_column索引可用於滿足where子句。