Voici l'ordre dans lequel les choses sont exécutées dans un moteur de base de données.
Notez qu'il s'agit d'une vue sémantique de la façon dont les choses sont exécutées, la base de données peut faire les choses dans un ordre différent, mais elle doit produire des résultats comme si cela avait été fait de cette façon.
- La partie FROM est d'abord évaluée, d'où puis-je obtenir des données
- Ensuite, la partie WHERE est évaluée, quelles lignes nous intéressent
- Ensuite, la partie GROUP BY est évaluée, comment combiner les lignes résultantes
- Ensuite, la partie HAVING est évaluée, quels groupes nous intéressent
- Ensuite, la partie ORDER BY est évaluée, dans quel ordre voulons-nous ces lignes/groupes
- Enfin, la partie SELECT est évaluée, quelles colonnes nous intéressent
Certains moteurs de base de données vous permettent cependant de contourner cela, en utilisant "GROUP BY 2" pour regrouper par la 2ème colonne dans la partie SELECT, mais si vous vous en tenez à l'ordre ci-dessus, vous devez savoir maintenant que la raison pour laquelle votre code ne fonctionne pas Cela ne fonctionne pas, c'est qu'il n'y a pas de colonnes avec les noms total ou total2 (encore).
En d'autres termes, vous devez soit répéter les deux expressions, soit trouver une autre façon de le faire.
Ce que vous pouvez faire est d'utiliser une sous-requête (à condition que vous ayez une version de MySQL qui le supporte) :
SELECT total, total2, total+total2 as grandtotal
FROM (
SELECT sum(EXPR) as total, sum(EXPR) as total2
FROM tablename
) x
Rayer le reste selon le commentaire.
Je ne connais pas grand-chose à MySQL, donc vous devrez peut-être créer un alias pour la sous-requête :
...
FROM tablename
) AS x
^-+^
|
+-- add this
Certains moteurs de base de données interdisent également l'utilisation du mot-clé AS lors de l'aliasing des sous-requêtes, donc si ce qui précède ne fonctionne pas, essayez ceci :
...
FROM tablename
) x
^
|
+-- add this