引用where子句中的复杂表达式值

时间:2010-02-24 18:47:20

标签: mysql mysql-error-1054

我有一个查询,其中我有一个复杂的日期表达式作为列之一。

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 个答案:

答案 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子句。