jointures SQL

Mammouth du PHP | 514 Messages

30 nov. 2006, 15:57

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`
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 nov. 2006, 16:20

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

Mammouth du PHP | 514 Messages

30 nov. 2006, 16:38

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 ...
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Mammouth du PHP | 514 Messages

30 nov. 2006, 16:41

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.
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Mammouth du PHP | 514 Messages

30 nov. 2006, 16:58

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 ...
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 nov. 2006, 17:06

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!

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

30 nov. 2006, 17:07

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.Tri
devrait mieux fonctionner... ;)

Mammouth du PHP | 514 Messages

30 nov. 2006, 17:30

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 ...
Ne jamais repousser à demain ce qu'on peut faire après demain ...

Mammouth du PHP | 514 Messages

30 nov. 2006, 17:34

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
Ne jamais repousser à demain ce qu'on peut faire après demain ...