Page 1 sur 1
jointures SQL
Posté : 30 nov. 2006, 15:57
par mcorgnet
Bonjour,
Dans la requête suivante, j'obtiens des valeurs nulles pour le quatrième champ dans mon SELECT, alors que certaines sont remplies. N'ayant pas l'habitude du LEFT JOIN, je fais appel à vous pour détecter mon erreur.
Vous y voyez qque chose ?
EDIT : je m'étais trompé dans la requête
Code : Tout sélectionner
SELECT `qual_eval_fields`.`Id` , `qual_eval_fields`.`Libelle` ,
`qual_eval_fields`.`Titre`, `qual_evaluations`.`Note`
FROM `qual_eval_fields` , `qual_evaluations` , `qual_organismes` , `qual_forms`
LEFT JOIN `qual_evaluations` `fields` ON (`qual_eval_fields`.`Id`=`qual_evaluations`.`FieldId`)
WHERE `qual_evaluations`.`OrgaId` = `qual_organismes`.`Id`
AND `qual_evaluations`.`FormId` = `qual_forms`.`Id`
AND `qual_forms`.`Id`=1
GROUP BY `qual_eval_fields`.`Id`
ORDER BY `qual_eval_fields`.`Tri`
Posté : 30 nov. 2006, 16:20
par albat
Déjà on va essayer d'y voir plus clair :
- virer toutes les apostrophes (superflues sous MySQL)
- utiliser des alias de tables
On découvre alors qu'il y a un 'fields' de trop just avant le ON de ta jointure.
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q, qual_evaluations E, qual_organismes O,
qual_forms F LEFT JOIN qual_evaluations ON (qual_eval_fields.Id=qual_evaluations.FieldId)
WHERE E.OrgaId = O.Id
AND E.FormId = F.Id
AND F.Id = 1
GROUP BY Q.Id
ORDER BY Q.Tri
Posté : 30 nov. 2006, 16:38
par mcorgnet
Bah ouais mais si je le mets pas, ça me renvoie une erreur :
"#1109 - Unknown table 'qual_eval_fields' in on clause "
Cela dit, j'ai fait un test sans le group by, et ça me renvoie pas loin de dix fois chaque ligne, et le champs "note" est parfois à 0, parfois à 2 (valeur que j'ai saisie pour un seul des champs), et pas toujours là ou ça devrait être comme ça.
J'ai jamais utilisé le left join, peut être ça mon problème ...
Posté : 30 nov. 2006, 16:41
par mcorgnet
cela dit, en fonction de ce que tu viens de me montrer, j'ai corrigé ainsi, et ça tourne :
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q, qual_evaluations E, qual_organismes O, qual_forms F
LEFT JOIN qual_evaluations `fields` ON ( Q.Id = E.FieldId )
WHERE E.OrgaId = O.Id
AND E.FormId = F.Id
AND F.Id =1
GROUP BY Q.Id
ORDER BY Q.Tri
Mais les notes (E.Note) sont toujours fausses. Même problème que précédemment si je supprime le GROUP BY, les champs se multiplient.
Posté : 30 nov. 2006, 16:58
par mcorgnet
Pour pousser le test, j'ai réduit (en utilisant ta méthode) le nombre de tables et de champs, et je n'ai pas remis le GROUP BY.
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q, qual_evaluations E
LEFT JOIN qual_evaluations ON ( Q.Id = E.FieldId )
ORDER BY Q.Tri
Mes résultats se répètent toujours, je me plante certainement dans mon LEFT JOIN.
Je cherche, je cherche ...
Posté : 30 nov. 2006, 17:06
par albat
Ta syntaxe n'est pas correcte.
Tu as écrit :
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q,
qual_evaluations E LEFT JOIN qual_evaluations ON ( Q.Id = E.FieldId )
ORDER BY Q.Tri
Ce qui signifie que tu fais une jointure entre qual_evaluations et... qual_evaluations!
Posté : 30 nov. 2006, 17:07
par albat
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q LEFT JOIN qual_evaluations E ON (Q.Id = E.FieldId)
ORDER BY Q.Tridevrait mieux fonctionner...

Posté : 30 nov. 2006, 17:30
par mcorgnet
super, ça tourne !
maintenant, je suis en train d'essayer de mettre plusieurs left join sur la même table.
J'trouve pas la syntaxe ...
Posté : 30 nov. 2006, 17:34
par mcorgnet
hum, à priori ça serait ça :
Code : Tout sélectionner
SELECT Q.Id, Q.Libelle, Q.Titre, E.Note
FROM qual_eval_fields Q, qual_forms F
LEFT JOIN qual_evaluations E ON ( Q.Id = E.FieldId
AND F.Id = E.FormId )
ORDER BY Q.Tri