Demande d'aide pour une requete SQL

WRInaute impliqué
Salut à tous,

Je souhaite dans le meilleur des mondes faire une requête de ce style :
Code:
SELECT champ, champ x 3 AS operation FROM matable WHERE operation = 8

Le probleme c'est que le champ "operation" de la clause where n'est pas reconnu car il n'existe pas dans la table.

Il faudrait donc théoriquement que je fasse ceci :
Code:
SELECT champ, champ x 3 AS operation FROM matable WHERE champ x 3 = 8

Le truc c'est que mon opération dans ma vraie requête est assez complexe, et je ne trouve pas ça très optimisé de la calculer deux fois.

Y'a t'il moyen de procéder autrement?

Merci
 
WRInaute accro
Tu peux créer une vue (view) intermédiaire:
[sql]
create view matable2 as select champ, champ * 3 as operation from matable;
[/sql]

Ensuite tu utilises matable2. Note que si ça aide en lisibilité, je ne suis pas sûr que ça change grand chose en termes de performances.

Jacques.
 
WRInaute impliqué
MySQL ne doit pas être stupide, il sait détecter les constantes. Lorsque MySQL reçoit une requête, il effectue une analyse afin d'éxaminer comment exécuter la tâche. Il vérifie par exemple la présence d'index à utiliser. Dans ton cas, il doit certainement détecter une même opération au sein de la requête, il effectuera celle-ci une seule fois.

Enfin, je peux me tromper.
 
WRInaute impliqué
Merci pour vos réponses.

Effectivement le fait de créer une vue ne dit pas changer grand chose en terme de performances. Espérons que MySql soit suffisamment intelligent pour ne pas calculer deux fois la même opération comme le sugère Blount :?
 
WRInaute accro
Code:
SELECT champ, champ x 3 AS operation FROM matable
HAVING operation = 8

La clause Having a justement été inventée car on ne pouvait pas effectuer de condition sur une agrégation dans la clause Where.

Bonne journée
 
WRInaute impliqué
Merci beaucoup YoyoS !

Effectivement je n'ai pas pensé à cette clause, ça fonctionne parfaitement. Mon script a l'air plus rapide du coup :)

Hop un truc de moins sur ma ToDo list :wink:
 
WRInaute impliqué
YoyoS a dit:
Code:
SELECT champ, champ x 3 AS operation FROM matable
HAVING operation = 8

La clause Having a justement été inventée car on ne pouvait pas effectuer de condition sur une agrégation dans la clause Where.

Bonne journée

Je me disais bien qu'il faudrait utiliser having ici. Mais dans la doc, il y a toujours la clause GROUP By associée à HAVING, je pensais alors qu'il n'était pas possible de l'utiliser sans (je ne sais pas pour vous, mais je trouve leur doc assez merdique).
 
Discussions similaires
Haut