Une jointure à trois table

bigjet
WRInaute discret
WRInaute discret
 
Messages: 211
Inscription: 21 Nov 2004

Une jointure à trois table

Message le Ven Mai 18, 2007 4:56

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: Tout sélectionner
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?


rog
WRInaute passionné
WRInaute passionné
 
Messages: 1662
Inscription: 21 Sep 2006

Message le Ven Mai 18, 2007 7:41

aparemment y a pas besoin de joindre quoi que ce soit, la table reponse comporte deja tous les index necessaires

rog


Kaliiii
WRInaute impliqué
WRInaute impliqué
 
Messages: 602
Inscription: 2 Mar 2005

Message le Ven Mai 18, 2007 7:42

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

lefou
WRInaute discret
WRInaute discret
 
Messages: 131
Inscription: 7 Juin 2005

Message le Ven Mai 18, 2007 10:32

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: Tout sélectionner
"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


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Mai 18, 2007 10:40

Pas besoin de joindre les trois tables je pense :

Code: Tout sélectionner
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


Borower
WRInaute passionné
WRInaute passionné
 
Messages: 2151
Inscription: 18 Avr 2005

Message le Ven Mai 18, 2007 14:09

Pour les doublons utilise plutot le "Select distinct"
La reponse de reglysse ma l'air bonne.

bigjet
WRInaute discret
WRInaute discret
 
Messages: 211
Inscription: 21 Nov 2004

Message le Ven Mai 18, 2007 15:03

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: Tout sélectionner
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: Tout sélectionner
SELECT questions.idq, questions.ques, reponses.rep
FROM questions LEFT JOIN reponses ON questions.idq = reponses.idq AND reponses.idu = $idu


reglysse
WRInaute discret
WRInaute discret
 
Messages: 150
Inscription: 19 Avr 2006

Message le Ven Mai 18, 2007 18:05

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: Tout sélectionner
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)


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités