Bonjour,

je dois affiché les réponses des questions par chapitre selon le projet. Donc j'ai un clé étrangère du chapitre (id_chapitre) dans la table Questions , car les chapitres peuvent avoir plusieurs questions et chaque question doit avoir seulement un chapitre.
De plus, les réponses aux questions dépendent de la question et du projet (1..--> 1..) donc j'ai crée la relation "ReponseSquestion" entre ces deux tables.
La table "ReponseSquestion" contient les clés étrangères: de la table "projets" -> id_projet et de la table "Questions" -> questions_id
Les réponses aux questions doivent être unique par projet.

dans ma page vue je dois affiché les questions en présentant son réponse (par projet) ainsi que les question qui ont pas des réponses (par chapitre).

Donc, mon probléme que j'arrive pas a obtenir la bonne requête pour récupérer ces informations par projet, j'ai trompé dans l'utilisation de jointure.
merci de me corriger.

Ce que je fais

-Mon essai:

SELECT * 
FROM ReponseSquestion res
LEFT JOIN Chapitres chp
    ON chp.id =:IdChapitre  -- ici il faudrait la jointure res et chp 
LEFT JOIN Questions ques
    ON ques.id = res.questions_id 
WHERE res.id_projet = :id
GROUP BY res.id_projet

Ce que j'ai obtenu

Cette requete permet d'afficher les même questions qui ont la réponse pour tous les chapitres et il écrase le reste des questions (n'ayant pas des réponses). C'est-a-dire, par exemple j'ai dans mon table "ReponseSquestion" une seule question répondu pour le chapitre N°5 et le projet N°4 (le regroupement par projet ça marche). Donc cette question elle est affiché avec son réponse pour tous les chapitres mais j'ai pas besoin de ça (j'ai des questions différentes par chapitre que ne se répètent pas ),. De plus, pour chaque chapitre j'ai des questions qui ont des réponses et d'autres non.

10 réponses


Kenor
Réponse acceptée

Avec la première, tu as la liste des "id de question" déjà répondu, tu en fais un tableau ou un "string" séparé par une virgule (selon l'ORM utilisé).

Puis tu fais simplement :

SELECT * 
FROM Questions ques
LEFT JOIN ReponseSquestion res
    ON ques.id = res.questions_id 
LEFT JOIN Chapitres chp
    ON chp.idChp = ques.chapitre_id
WHERE ques.id NOT IN ($taListe) AND res.id_projet = :id AND chp.id = :IdChapitre
GROUP BY ques.id

Encore une fois, je ne comprend pas tout de la logique, donc je te laisse déméler ;)
A priori, il doit y avoir moyen d'utiliser IS NULL pour les questions non répondus sans passer par la liste d'id.

Salut,

Tu as une clé étrangère dans la table Chapitres qui permettrait de la relier à la table ReponseSquestion ?

emile01
Auteur

non, j'ai les clés étrangéres suivantes;

  • la table ReponseSquestion: contient les clés étrangéres de la table Projets et Questions : id_projet + questions_id (car la réponse dépend du projet et de la question)
  • la table Questions : contient la clé étrangére de la table Chapitres: chapitre_id (car un ensemble des questions par chapitres )

=> donc pas besoin de relier la table Chapitres avec la table ReponseSquestion car il n'existe aucune relation entre eux, c'est çà ?

Comment compte-tu relier tes tables dans ce cas là ?
Comment s'organise ton schéma de BD ? J'avoue avoir un peu de mal à visualiser...

emile01
Auteur

voilà mon schéma de BD et merci pour ton aide mon ami:

dans ton where c'est ton id en get ?

WHERE res.id_projet = :id

A vrai dire, je n'ai pas tout compris non plus, donc j'ai brodé autour de tes explications.

SELECT * 
FROM ReponseSquestion res
LEFT JOIN Questions ques
    ON ques.id = res.questions_id 
LEFT JOIN Chapitres chp
    ON chp.idChp = ques.chapitre_id
WHERE res.id_projet = :id AND chp.id = :IdChapitre

En gros, je récupère les réponses qui sont liés aux questions, qui sont eux même liés aux chapitres.
Mais je ne renvoi que les réponses appartenant aux projets ":id" et aux chapitres ":idChapitre".

De ce que j'ai compris, c'est ce que tu souhaites obtenir.

emile01
Auteur

Merci pour tes réponses mes amis,
neecride, oui l'id est dans le get. il est bien récupéré .

Exactement ce que je veux Kenor mais il manque un autre chose " Mais je renvoi les réponses appartenant aux projets ":id" et aux chapitres ":idChapitre" et aussi les questions qui ne sont pas encore répondu par chapitre (:idChapitre) "

slt quelau'un est til dispo a maider ?

emile01
Auteur

Merci pour ton aide Kenor