Une jointure à trois table

WRInaute discret
Bonjour à tous,

Je sollicite votre aide pour résoudre un problème de jointure.

En fait, j'ai trois tables (Mysql), dont une qui sert à faire un lien entre les deux autres.

Voici une structure simplifiée des tables avec les champs pertinents.

Code:
questions(idq, ques)
utilisateurs(idu, nom)
reponses(idq, idu, rep)

Jusque la rien de très compliqué, la table "reponses" permet de stocker qui a répondu à quelle question.

La requête que je dois réaliser c'est pour un utilisateur donné, de lister toutes les questions répondues ou pas. Si la question n'est pas répondue, les champs réponses doivent être à NULL.

J'ai essayé de regarder du côté des jointures LEFT, qui garantissent que la table de gauche contiendra toutes les lignes (dans ce cas toutes les questions) mais j'ai pas réussi à trouver le résultat voulu.

Pensez-vous qu'il est possible de réaliser cette requête?
 
WRInaute passionné
aparemment y a pas besoin de joindre quoi que ce soit, la table reponse comporte deja tous les index necessaires

rog
 
WRInaute occasionnel
Effectivement c'est bien LEFT JOIN qui permet de lier les tables de cette facon. Si tu as des doublons dans tes résultats tu peux utiliser un GROUP by champ_commun

Lis bien la doc de Mysql sur LEFT JOIN, moi je l'utilise pour lier deux a trois tables fréquement, ca marche correctement
 
WRInaute discret
A mon avis (et si j'ai bien compris la question) il faudrait déjà revoir les tables car les questions ne sont rattachées à aucun utilisateur. Je verrais plutôt :

utilisateurs(idu, nom)
questions(idq, ques, utq)
reponses(idr, rep, qrep,utrep)


utq => utilisateur ayant posté la question
qrep => question rattachée à la réponse
utrep => utilisateur ayant posté la réponse

Ensuite la requête (à vérifier) :
Code:
"select u.nom, q.ques, r.rep from utilisateurs as u, questions as q left join reponses as r on (r.qrep = q.idq) where q.utq = u.idu and u.idu = ".$nom_utilisateur
 
WRInaute discret
Pas besoin de joindre les trois tables je pense :

Code:
SELECT questions.idq, questions.ques, reponses.rep
FROM questions LEFT JOIN reponses ON questions.idq = reponses.idq
WHERE reponses.idu = $idu OR reponses.idu is null

J'ai testé ça marche, ça renvoit bien toutes les questions et si l'idu n'a pas répondu à une question, tu as "NULL" dans reponses.rep
 
WRInaute passionné
Pour les doublons utilise plutot le "Select distinct"
La reponse de reglysse ma l'air bonne.
 
WRInaute discret
Premièrement, merci à tous ceux qui se sont donnés la peine de se pencher sur le problème.

En effet reglysse, je me suis rendu compte en allant me coucher hier soir qu'on avait besoin que de deux tables.

Cependant, es-tu sur que ta requête fonctionne? Chez moi, ça ne retourne pas les questions non répondus.

En jouant un peu avec la requête, je me suis rendu compte que celle-ci semblait fonctionner:

Code:
SELECT questions.idq, questions.ques, reponses.rep
FROM questions LEFT JOIN reponses ON questions.idq = reponses.idq AND reponses.idu = $idu OR reponses.idu is null
(remarquer l'absence du WHERE)

et celle-ci marche tout autant

Code:
SELECT questions.idq, questions.ques, reponses.rep
FROM questions LEFT JOIN reponses ON questions.idq = reponses.idq AND reponses.idu = $idu
 
WRInaute discret
Ah bon ça marche pas chez toi, pourtant j'ai testé moi ça marche...

Mais bon tu as trouvé une autre requête qui fonctionne, c'est cool.

Par contre il faut peut-être juste rajouter des parenthèses pour être sur :

Code:
SELECT questions.idq, questions.ques, reponses.rep 
FROM questions LEFT JOIN reponses ON questions.idq = reponses.idq AND (reponses.idu = $idu OR reponses.idu is null)
 
Discussions similaires
Haut