Demande d'aide SQL

WRInaute discret
Salut,

Dans une requete SQL, j'aimerai utiliser un alias dans la clause WHERE.
Bon, je sais que ce n'est pas possible :
Code:
 Notez que ANSI SQL ne vous permet pas de vous référer à un alias dans une clause WHERE. Il en est ainsi car lorsque le code de WHERE est exécuté, la valeur de la colonne ne peut pas encore être déterminée. Par exemple, la requête suivante est illégale :

SELECT id,COUNT(*) AS cnt FROM nom_de_table WHERE cnt > 0 GROUP BY id;

La clause WHERE est exécutée pour savoir quelles lignes devraient être inclues dans la partie GROUP BY tandis que HAVING est utilisé pour décider quelles lignes du jeu de résultats doivent être utilisées.

Mais j'aimerai savoir s'il y a une façon de faire.
Petit exemple:
Code:
SELECT IF( v.date_controle_vehicules=v.date_circulation_vehicules,
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
) AS nb_jours  
FROM cta_comptes c INNER JOIN cta_vehicules v USING (id_comptes)
WHERE nb_jours=30 
OR nb_jours=15 
OR nb_jours=3
Je sais que je peux réutiliser l'expression complete à la place de l'alias (ici nb_jours), mais j'aimerai faire plus simple si possible.

J'ai vu aussi qu'on pouvais utiliser des variables utilisateurs avec MySQL (en assignant comme ceci :
Code:
SELECT @nb_jours:=IF( v.date_controle_vehicules=v.date_circulation_vehicules,
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
) AS nb_jours  
FROM cta_comptes c INNER JOIN cta_vehicules v USING (id_comptes)
WHERE @nb_jours=30 
OR @nb_jours=15 
OR @nb_jours=3
, mais ceci n'est pas bon non plus..

Quelqu'un aurait une solution?
 
WRInaute discret
créé une table temporaires
avec les champs id_comptes et nb_jours

en faisant un truc genre (pas testé)

select c.id_comptes,
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
) AS nb_jours
into tabletempo
FROM cta_comptes c INNER JOIN cta_vehicules v USING (id_comptes)

et ensuite, fais une jointure ... supplémentaire
sur cette table là :)
 
WRInaute discret
Oui, je peux le faire avec une table temporaire ou alors en réécrivant l'expression à chaque fois :
Code:
SELECT *,
IF( (v.date_controle_vehicules=v.date_circulation_vehicules),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
) AS nb_jours
FROM cta_comptes c INNER JOIN cta_vehicules v USING (id_comptes) 
WHERE IF( (v.date_controle_vehicules=v.date_circulation_vehicules),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
)=30 
OR IF( (v.date_controle_vehicules=v.date_circulation_vehicules),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
)=15 
OR IF( (v.date_controle_vehicules=v.date_circulation_vehicules),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 4 YEAR) )-TO_DAYS( NOW() ) ),
(TO_DAYS( DATE_ADD( v.date_controle_vehicules, INTERVAL 2 YEAR) )-TO_DAYS( NOW() ) )
)=3

Mais j'aurais aimé avoir une solution pour la lisibilité. Cette requete est assez simple, mais ça m'aurait servi pour d'autres... :(
 
Discussions similaires
Haut