2

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

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 子句中重新计算,但这似乎很愚蠢。为什么数据库要计算该日期两次?或者,优化器会存储该值吗?

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

为了获得最佳性能,您应该在 where 子句中索引date_column并将计算移动到比较器的另一侧,如下所示:

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

于 2010-02-24T20:14:40.043 回答