Ok
Un exemple court (dans mon problème mes requêtes sont trèèèès longues) :
> SELECT `tempo`.`minutes`*60*(SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'temps_de_chute',
`tempo`.`distance`*(SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'distance_de_chute'
FROM `tempo`;
|
Je me retrouve avec 2 sous-requêtes.
Je me suis d'abord demandé s'il était possible de n'appeler qu'une seule fois la sous-requête par enregistrement de tempo(ce serait je pense idéal) :
> SELECT (SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`) AS 'nbchutes',
`tempo`.`minutes`*60*`nbchutes` AS 'temps_de_chute',
`tempo`.`distance`*`nbchutes` AS 'distance_de_chute'
FROM `tempo`;
|
... Mais ça ne marche pas, car lemoteur SQL ne reconnait pas `nbChutes`; alors je me suis dit d'au moins rendre la requête plus lisible, en factorisant l'appel par une fonction :
> CREATE FUNCTION nbChutes (id int(11)) RETURNS int(11)
RETURN (SELECT COUNT(*) FROM `chutes` WHERE `chutes`.`id_maladroit`=`tempo`.`id_maladroit`);
> SELECT `tempo`.`minutes`*60*nbChutes(`tempo`.`id_maladroit`) AS 'temps_de_chute',
`tempo`.`distance`*nbChutes(`tempo`.`id_maladroit`) AS 'distance_de_chute'
FROM `tempo`;
|
Mais bien évidement, il ne m'est pas autorisé de faire un SELECT dans une fonction ...
Voilà, j'espère que c'est un peu plus clair