Bonjour,
Comment feriez-vous pour récupérer des champs de la table 'Porter'
Code:
1
2
3 SELECT Pays_Nom FROM Pays LEFT JOIN Porter ON Pays.Pays_Code = Porter.Pays_code AND Porter.CRM_No=1 WHERE Porter.Pays_Code is null;
Merci
Version imprimable
Bonjour,
Comment feriez-vous pour récupérer des champs de la table 'Porter'
Code:
1
2
3 SELECT Pays_Nom FROM Pays LEFT JOIN Porter ON Pays.Pays_Code = Porter.Pays_code AND Porter.CRM_No=1 WHERE Porter.Pays_Code is null;
Merci
Salut,
Comme ça :
Code:
1
2
3
4
5
6 SELECT Pays_Nom, Porter.* FROM Pays LEFT JOIN Porter ON Pays.Pays_Code = Porter.Pays_code AND Porter.CRM_No = 1 WHERE Porter.Pays_Code IS NULL;
Ou comme ça:
Code:
1
2
3
4
5
6
7
8 SELECT * FROM Pays, Porter WHERE Pays.Pays_Code = Porter.Pays_code AND Porter.Pays_Code IS NULL AND Porter.CRM_No = 1;
Bonjour,
@janmaruku
sûrement pas, on ne fait pas de jointures de tables dans la clause WHERE qui ne doit servir qu'au filtrage des données et à rien d'autre.
Les jointures ne doivent être faites que dans la clause FROM prévue pour cela.
Ça m'intéresse car Je les fais moi même quasiment tout le temps dans le where, cela change quoi concrètement en terme de traitement ?
Merci pour ces réponses.
Je me suis donc inspiré des lignes ci-dessus pour écrire ça.
Le problème est que ça me retourne des données fausses.
Les résultats de NB_TOT sont multipliés par 8.Code:
1
2
3
4
5
6
7
8 $query = mysql_query("SELECT lib_dga, dga, DGAA, sum(m.NB_TOT) as NB_TOT FROM structure as s LEFT JOIN m41000 as m ON s.dga = m.DGAA WHERE m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='action1' GROUP BY s.dga, m.DGAA") or die (mysql_error()); while($array = mysql_fetch_assoc($query)) { print $array['lib_dga'];echo "<br>"; print $array['NB_TOT'];echo "<br>"; }
Salut,
Qu'est ce qu'il y a dans ton champ "NB_TOT" de ta table m41000 ?
Pour info, le "SUM" fait la somme sur tous les résultats retournés. Une piste qui peut t'aider : fais un tour sur la partie "GROUP BY" de la doc SQL :)
@dmcissokho
un peu de lecture ici
@tapi21
Si tu ne spécifies pas le résultat escompté peu de gens seront motivés à t'aider. Tu pourrais par exemple poster la structure de tes tables.
En passant je t'invite à adopter une nomenclature un peu plus explicite pour le libellé de tes tables.
Cordialement
Merci de votre patience, je vais essayer d'être le plus précis possible. Je bute depuis plusieurs jours et et pense que la solution doit exister :
Soit deux tables "structure" et "m41000".
Les champs "dga" et "lib_dga" dans la table "structure" et les champs "DGAA", "NB_TOT", "DRR", "CCIBLE", "LIBELLE_ACTION" dans la table m41000.
Les deux tables sont liées par les champs "dga" et "DGAA".
Je souhaiterai faire la somme de tous les champs" NB_TOT" avec la condition WHERE et ne récupérer que les champs "lib_dga" correspondant aux champs "DGAA".
J'ai écrit ça, mais le résultat est encore faux :
A vot' bon coeur.Code:
1
2
3
4
5
6
7 $query = mysql_query("SELECT DISTINCT lib_dga, dga, DGAA, sum(NB_TOT) as NB_TOT FROM structure as s INNER JOIN m41000 as m ON s.dga=m.DGAA and m.CCIBLE=0 and m.DRR='41270' and m.LIBELLE_ACTION='CREDIT BAIL A ECHEANCE ' 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>"; }
Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes.
Voici la requête récrite et corrigée :
Elle va donner la somme de NB_TOT par dga.Code:
1
2
3
4
5
6
7 SELECT s.lib_dga, s.dga, m.DGAA, SUM(NB_TOT) AS NB_TOT FROM structure s INNER JOIN m41000 m ON s.gda = m.DGAA WHERE m.CCIBLE = 0 AND m.DDR = '41270' AND m.LIBELLE_ACTION = 'CREDIT BAIL A ECHEANCE ' GROUP BY s.lib_dga, s.dga, m.DGAA
D'ailleurs, s.dga et m.DGAA étant liés par une égalité dans la condition de jointure, à quoi sert de récupérer les deux informations qui sont par définition identiques ?
Quel est le résultat attendu ?Citation:
mais le résultat est encore faux :
J'ai utilisé ton script (en modifiant deux petites fautes de frappe) et le résultat est toujours identique.
Dans la table m41000 la valeur de NB_TOT pour les dga concernées (seulement 2) par la clause WHERE est de 1. Dans la table structure il existe 8 lignes pour une des dga et 7 pour l'autre (ces dga sont des unités mères avec 8 filles pour l'une et 7 pour l'autre). Et ce sont ces deux chiffres qui me sont restitués avec ce script.:cry:
Bis repetita :
Donne nous un jeu de données en entrée et le résultat attendu.Citation:
Envoyé par CinéPhil
Donc si pour ces lignes NB_TOT = 1, il est bien normal que la somme de NB_TOT donne 8 et 7 !Citation:
Dans la table structure il existe 8 lignes pour une des dga et 7 pour l'autre (ces dga sont des unités mères avec 8 filles pour l'une et 7 pour l'autre). Et ce sont ces deux chiffres qui me sont restitués avec ce script.
Euréka, après des jours de recherches, j'ai trouvé ce script. En fin de compte mon problème devait venir du fait que des champs liés devraient porter le même nom (?)
Merci à tous.Code:
1
2
3
4 $query = mysql_query("SELECT DISTINCT s.lib_dga, s.DGAA, m.NB_TOT FROM structure as s INNER JOIN (SELECT DGAA, sum(NB_TOT) AS NB_TOT FROM m41000 as m WHERE m.CCIBLE = 0 AND m.DRR = '41270' AND m.LIBELLE_ACTION = 'ANNIVERSAIRE 12 ANS ' GROUP BY m.DGAA) m ON s.DGAA=m.DGAA;") or die (mysql_error());