Jointure entre 3 table qui affiche les commentaire en double

Par JMERISE, il y a 10 ans


Bonjour Bonsoir,

Je suis entrais de travailler sur un forum mais je rencontre un petit prôbléme lors que je veux récupperais les commentaire poster sur le topic.

Donc j'ai 3 table la 1er qui stocke les info sur le membre la 2eme le topic et la 3eme qui stocke les commentaire du topic, j'ai fait une jointure en sql mais il m'affiche en deux foit choque commentaire.

code sql :

// selectinnez les message poster sur le topic. $reqcomment = $bdd->query('SELECT commentaire_topic.*, membre.*, topic.* FROM commentaire_topic, membre, topic WHERE commentaire_topic.id_topic = topic.id_topic1');

et pour afficher les commentaire je fait un while :

$commentaire = $reqcomment->fetch()

si vous pouvez m'aider sa serais simpas de votre part merci.

15 réponses

JMERISE, il y a 10 ans

J'ai remarqué que en plus des doublons il affiche le même commentaire sur tous les topic.

driven78, il y a 10 ans

tu peux mettre un GROUP BY sur l'id du commentaire

Huggy, il y a 10 ans

Ta table commentaire-topic est reliée à ta table topic mais ta table membre n'est reliée à rien, donc ça te fait un produit cartesien.
Il faut relier un commentaire au membre qui la posté.

Tackacoder, il y a 10 ans

Bonjour,
as-tu essayé avec des jointures de type LEFT JOIN ou INNER JOIN ?

JMERISE, il y a 10 ans

j'ai essayer un INSERT JOIN

Benjamin Derepas, il y a 10 ans

Si tu as des doublons, tu peux regarder du coté de DISTINCT

kadevland, il y a 10 ans

Tu peux donner les structures de tes tables.
Mais je vois déjà 2 erreurs dans la requête SQL,
Déjà le jointure non explecite c'est mal, et là si je me trompe pas c'est du cross join donc multiplicateur, il faut du inner joint
si je réecrit ta requête comme il faudrat ça donne ça:

SELECT commentaire_topic.*, membre.*, topic.* FROM commentaire_topic inner join topic on commentaire_topic.id_topic=topic.id_topic1 inner join membre on ..... quoi? manque la condition de jointure

jointure sql cours

JMERISE, il y a 10 ans

J'ai mis
"

DISTINCT

"
après le mot SELECT mais rien ne changer puis avec

Oracle

il m'affiche une erreur

JMERISE, il y a 10 ans

salut,
avec ce code il m'affiche chaque message une fois mais il me l'affiche sur tous les page même si je fait comme toi :

commentaire_topic.id_topic = topic.id_topic1
kadevland, il y a 10 ans

La requête est incomplete.
d'ou la question "Tu peux donner les structures de tes tables." ainsi ce que tu veux faire

JMERISE, il y a 10 ans

Voila ce que j'ai mis dans la partie incompléte mais il m'affiche t'oujour tous les commentaire:

commentaire_topic.id_user = membre.id
kadevland, il y a 10 ans

maintenant tu limites les resultats par un where topic.id_topic1= ton id de topic

JMERISE, il y a 10 ans

le id_topic1 est déja l'id de topic

kadevland, il y a 10 ans

C'est La PK de la table mais il à bien une valeur unique.
Là tu dis sur quel champ il fait la liaison (uniquement)

Je te donne un exemple avec juste une petite différence, mais qui change énormément le résultat

Exemple 1

Select commentaire.*,user.* from commentaire inner join user on commentaire.user_id=user.id inner join topic on topic.id= commentaire.topic_id where user.login="kadevland" and commentaire.titre="Cours SQL"

Je veux tous les commentaires de kadevland pour le topic dont le titre est Cours SQL

Exemple 2

Select commentaire.*,user.* from commentaire inner join user on commentaire.user_id=user.id inner join topic on topic.id= commentaire.topic_id where commentaire.titre="Cours SQL"

Je veux tous les commentaires (avec les informations des auteurs) pour le topic dont le titre est Cours SQL

si tu précises pas "les limites" cad where c'est normal que tu es tous

kadevland, il y a 10 ans

IL faut pas confondre synification et valeur, c'est comme en POO la définition de la class et l'instance.