2010-02-24 2 views
2

J'ai une requête où j'ai une expression de date complexe comme l'une des colonnes.se réfère à la valeur d'expression complexe dans where clause

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 

Je veux faire référence à cette colonne dans la clause where

WHERE complex_date_calculation < NOW() 

Mais mysql selfs là-dessus.

1054: Unknown column 'complex_date_calculation' in 'where clause' 

Une façon de le faire est de l'envelopper dans un sous-select

SELECT * FROM ( 
    SELECT 
     date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
    FROM table 
) AS alias 
WHERE complex_date_calculation < NOW() 

Est-ce la meilleure façon?

Je pourrais aussi refaire le calcul dans la clause WHERE, mais cela semble stupide. Pourquoi la base de données a-t-elle calculé cette date deux fois? Ou, l'optimiseur stockera-t-il cette valeur?

Répondre

2

Ce que je veux est HAVING:

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 
HAVING complex_date_calculation < NOW() 
+0

Dans mon cas, je devais utiliser à la fois un « où » et aussi ce « avoir ». Cela fonctionne parfaitement :) –

0

Pour des performances optimales, vous devriez index date_column et déplacer le calcul de l'autre côté du comparateur dans la clause where, comme suit:

SELECT 
    date_column + INTERVAL(complex_jimmy_jam) DAY AS complex_date_calculation 
FROM table 
WHERE date_column < NOW() - INTERVAL(complex_jimmy_jam) DAY 

De cette façon, l'index sur date_column peut être utilisé pour satisfaire la où clause.