我有一个查询,其中我有一个复杂的日期表达式作为列之一。
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子句中重新进行计算,但这看起来很愚蠢。为什么数据库计算该日期两次?或者,优化器会存储该值吗?
答案 0 :(得分:2)
我想要的是HAVING
:
SELECT
date_column + INTERVAL( complex_jimmy_jam ) DAY AS complex_date_calculation
FROM table
HAVING complex_date_calculation < NOW()
答案 1 :(得分: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子句。