select imbriqués

Répondre
tapi
le 27/02/2013 à 16:55
tapi
Bonjour,
J'ai un problème de cohérence de restitution de données.
J'ai deux tables "structure" et "m41000". Dans le table "structure" , j'ai deux champs "dga" et "lib_dga" et dans la table "m41000" : "CCIBLE", "DGAA", "DRR", "LIBELLE_ACTION" et "NB_TOT". Les deux tables sont liées par les champs "dga" et "DGAA". Je souhaite faire la somme de "NB_TOT" suivant le critère dans le "WHERE" et restituer le champ "lib_dga". Je récupère bien mon champ "lib_dga", mais les sommes de "NB_TOT" sont multipliées par le nombre de ligne de la table "structure".
Voilà le code :
<?php $query = mysql_query("SELECT DISTINCT dga, DGAA, sum(NB_TOT) as NB_TOT FROM m41000 as m INNER JOIN structure as s ON m.DGAA = s.dga and m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='CREDIT BAIL A ECHEANCE          '
WHERE m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='action1' GROUP BY m.DGAA") or die (mysql_error());
while($array = mysql_fetch_assoc($query))
{
print $array['lib_dga'];echo "<br>";
print $array['NB_TOT'];echo "<br>";

}?>

Auriez-vous une idée ?
Merci
HugeBear
le 05/03/2013 à 16:27
HugeBear
Bon désolé de te l'annoncer brutalement, mais ton SQL est tout "pas bien"

1 - Ton GROUP BY n'est pas complet, il faut prendre tous les champs du SELECT sauf le Sum.
2 - Le DISTINCT, c'est pas utile.
3 - les Filtres dans le INNER JOIN, c'est a bannir. Surtout que tu en remets dans le WHERE.
4 - Tu as bien fait de mettre des alias de table, mais utilises les partout.
5 - Dans ton SELECT tu n'utilises pas les champs de "structure" (hors mis la clé de jointure)

je te propose plutôt ça :
SELECT m.DGAA
, s.lib_dga
, Sum(NB_TOT) as NB_TOT
FROM m41000 as m
INNER JOIN structure as s
ON m.DGAA = s.dga
WHERE m.CCIBLE = 0
and m.DRR = '41270'
and m.LIBELLE_ACTION In( 'action1' , 'CREDIT BAIL A ECHEANCE ' )
GROUP
BY m.DGAA
, s.lib_dga
Zzzzzz
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours