2

列の 1 つとして複雑な日付式を持つクエリがあります。

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'

これを行う1つの方法は、サブセレクトでラップすることです

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 回計算するのはなぜですか? または、オプティマイザはその値を保存しますか?

4

2 に答える 2

2

私が欲しいのはHAVING

SELECT 
    date_column + INTERVAL( complex_jimmy_jam ) DAY AS complex_date_calculation
FROM table
HAVING complex_date_calculation < NOW()
于 2010-02-25T17:03:17.487 に答える
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

このようにして、インデックス ondate_columnを使用して where 句を満たすことができます。

于 2010-02-24T20:14:40.043 に答える