|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Nouveau Membre du Club
![]() |
Bonjour,
Je suis un peu désespérée, je dois réaliser une requête pour me récupérer ce que j'appelle des "campagnes marketing" malheureusement je dois aussi calculer certains statistiques sur ces résultats. Pour cela je fais appel à 3 tables : campaign_marketing : contient les données des campagnes evaluation_action : contient les données des évaluations de façon générale evaluation_informations : contient les données détaillées de chaque évaluation_action (je sais les noms sont mal choisis et la base mal architecturée mais malheureusement je dois faire avec) Mon problème étant que je dois récupérer toutes les campaign_marketing même si ces dernières n'ont pas d'évaluations qui leur sont liées, c'est pourquoi j'utilise des left join. Or, je dois absolument tester la concordance entre ces 3 tables sur un couple d'identifiant stockés dans campaign_marketing : le id_project et le cpid. l'id_projet trouve sa concordance dans evaluation_action et le cpid dans evaluation_informations. Code :
Et voici ma question : dans le premier LEFT JOIN on ne teste que l'id_project comment faire pour tester ce dernier alors qu'il n'est que dans la table evaluation_informations et que je dois passer au préalable par evaluation_action pour établir la concordance entre ces deux tables? Aidez-moi svp je désespère vraiment |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
Je ne suis pas sûr d'avoir bien compris ton problème... En fait, je crois que ta requête est correcte ! Peux-tu poster les structure des 3 tables... |
|
|
00
|
|
|
#3 | ||
|
Nouveau Membre du Club
![]() |
ok, je vais vous épargnez tous les champs non concernés par la requête dans ce cas sinon ce sera imbuvable
Le problème comme je l'ai dit est que j'ai un index sur id_project et cpid dans la table campaign_marketing et j'ai besoin de calculer des stats avec les champs d'evaluation_action et d'autres stats avec evaluation_information Or, cette requête ne teste pas le couple id_projet et cpid dans evaluation_action mais seulement dans evaluation_informations du coup mes stats pour evaluation_action sont faussés. structure des 3 tables : Code :
left join sur evaluation_action AS eva ON (et ici vérifier la concordance id_project comme je le fais déjà ET AUSSI cpid comme je le fais dans le left join de evaluation_informations) |
||
|
|
00
|
|
|
#4 | ||
![]() ![]() |
Ta question et ta requête laissent supposer qu'il peut y avoir des "inf" qui sont associées à d'autres "eva" que celles de la "cm" auxquelles sont associées les "inf".
Comme tu dis, la BDD est mal foutue ! ![]() Peut-être que ceci peut résoudre simplement le problème ? Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#5 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
oui, après une (courte
En fait si je comprend bien : Si pour un couple CPID/id_projet donné dans campaign_marketing, il y une ligne dans evaluation_action (même id_projet) et deux lignes dans evaluation_informations (même cpid), alors par exemple un SUM sur une colonne de la table evaluation_action renverra le double de la valeur attendue... @Cinephil: Merci, avec ta réponse, j'ai mieux compris la question par contre, je pense que ton filtre va faire perdre "l'interet" ici du LEFT JOIN... Car si à l'inverse aucune ligne dans evaluation_informations ne correspond à un cpid donné, le resultat n'incluera pas les lignes de campaign_marketing qui ont ce cpid... peut être que le plus simple, est alors de faire ainsi, car si j'ai bien compris, le but est de faires des stats, donc j'imagine que charlene44 compte agréger les colonnes des tables eva et inf (surtout qu'elle parle de goup by...) donc peut être quelque chose comme ceci : Code SQL :
Ou alors, (ce qui pourrait etre mieux si plusieurs colonnes de evaluation_informations sont concernées), faire une jointure externe sur une sous requete en pseudo table effectuant déja le group by..., afin de n'avoir au plus qu'une ligne par couple cpid/id_projet charlene44, pourrais-tu nous donner la requete complète que tu as faite, on y verra peut etre plsu clair... petite question aussi à charlene44 : es-tu sûre de ça : Citation:
|
|||
|
|
00
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() |
Désolé pour cette longue absence, vacances oblige ^^
donc pour ma requête, la voici en entier : Code :
si je remplace mes left join par des join simple cela marche, j'ai les bons statistiques mais je ne récupère pas de campaign_marketing si elles n'ont pas d'evaluations rattachées, c'est pourquoi je dois avoir des left join. Il faudrait réussir à tester le cpid dans le premier left join, rajouter un test comme ceci : Code :
LEFT JOIN evaluation_action AS eva ON eva.ID_PROJECT = cm.id_project AND cm.cpid = inf.CPID |
||
|
|
00
|
|
|
#7 | |||||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Arfff
Code SQL :
Les bonnes surprises de MySQL La liste des colonnes dans la GROUP BY devrait correspondre à la liste des colonnes non agrégées dans ton SELECT, ce qui n'est pas le cas ici... Je crois que dans ce cas, MySQL "décide" (à l'insu de ton plein grès Je dirai même qu'il ne "décide" pas mais prend sûrement la première qui lui tombe sous la main... évites ce genre de syntaxe, ça ne peut aboutir qu' à de mauvaises surprises... Ajoutes toutes tes colonnes (non agrégées) dans ton GROUP BY, et vois si le résultat te semble plus cohérent : Code SQL :
Sinon poste un jeu de données car : Citation:
|
|||||
|
|
00
|
|
|
#8 |
|
Nouveau Membre du Club
![]() |
merci pour votre aide, j'ai testé vos solutions, avec des sous requetes je me suis approché du résultat mais ce n'était pas ca.
La solution a donc été de créer une vue et de tester le couple cpid et id_project sur cette vue En tout cas merci beaucoup. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com