Une jointure à trois table

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

bigjet
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 211
Inscription: Dim Nov 21, 2004 18:30

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 accro
WRInaute accro
 
Messages: 1662
Inscription: Jeu Sep 21, 2006 2:32

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 passionné
WRInaute passionné
 
Messages: 595
Inscription: Mer Mar 02, 2005 11:33

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 occasionnel
WRInaute occasionnel
 
Messages: 120
Inscription: Mar Juin 07, 2005 14:10

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 occasionnel
WRInaute occasionnel
 
Messages: 148
Inscription: Mer Avr 19, 2006 16:51

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 accro
WRInaute accro
 
Messages: 2151
Inscription: Lun Avr 18, 2005 20:58

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 occasionnel
WRInaute occasionnel
 
Messages: 211
Inscription: Dim Nov 21, 2004 18:30

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 occasionnel
WRInaute occasionnel
 
Messages: 148
Inscription: Mer Avr 19, 2006 16:51

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)


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

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