ссылаться на значение комплексного выражения в предложении where - PullRequest
2 голосов
/ 24 февраля 2010

У меня есть запрос, где у меня есть сложное выражение даты в качестве одного из столбцов.

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 ]

2 голосов
/ 25 февраля 2010

То, что я хочу, это HAVING:

SELECT 
    date_column + INTERVAL( complex_jimmy_jam ) DAY AS complex_date_calculation
FROM table
HAVING complex_date_calculation < NOW()
0 голосов
/ 24 февраля 2010

Для оптимальной производительности следует индексировать 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.

...