0

I'm building this form: http://pwmn.73dpi.com/questionnaire.php and have the questions and answers in a database, in two separate tables.

Here is the exact structure of the two db tables:

table[questions]

id  
order   
text

table[answers]

id  
fk_question 
order   
text    
points

The answers table relates to the questions one by an fk_question field.

This is my query:

SELECT
  Q.id, Q.text, R.text, R.order AS rorder
FROM
  `questions` Q
  LEFT JOIN reponses R
    ON Q.id = R.fk_question 

The result of the above query is:

id  qtext   rtext   rorder
1   Vous discutez avec un commerçant et malgré le fait...   Vous passez à l'anglais. Si ça peut lui faire plai...   1
1   Vous discutez avec un commerçant et malgré le fait...   Vous lui faites remarquer et lui demandez s'il peu...   2
1   Vous discutez avec un commerçant et malgré le fait...   Vous continuez à lui parler en français, mais vous...   3
2   En faisant vos courses, vous remarquez que la boît...   Vous achetez le produit sans en faire de cas.   1
2   En faisant vos courses, vous remarquez que la boît...   Vous achetez le produit, mais vous prenez auparava...   2
2   En faisant vos courses, vous remarquez que la boît...   Vous achetez le produit et vous contactez la compa...   3
3   Vous revenez d'un voyage à l'étranger et devez vou...   Vous faites valoir votre droit de vous faire servi...   1
3   Vous revenez d'un voyage à l'étranger et devez vou...   Vous prenez place devant le  guichet d'à côté, mai...   2
3   Vous revenez d'un voyage à l'étranger et devez vou...   Vous prenez place devant le guichet d'à côté, et v...   3
4   Dans la salle d'attente chez le médecin, vous comm...   Vous arrachez discrètement la page du mot croisé p...   1
4   Dans la salle d'attente chez le médecin, vous comm...   Vous laissez le mot croisé et replacez le magazine...   2
4   Dans la salle d'attente chez le médecin, vous comm...   Vous prenez la peine d'effacer les réponses que vo...   3
5   Dans des toilettes publiques, vous remarquez qu'un...   Vous sortez un stylo et vous corrigez l'erreur. 1
5   Dans des toilettes publiques, vous remarquez qu'un...   Vous sortez un stylo et biffez l'erreur en ajoutan...   2
5   Dans des toilettes publiques, vous remarquez qu'un...   Vous ne vous en préoccupez pas. 3
6   Vous êtes chargé de mener une réunion d'affaire av...   Vous proposez que la réunion se déroule en françai...   1
6   Vous êtes chargé de mener une réunion d'affaire av...   Vous proposez que la réunion se déroule en anglais...   2
6   Vous êtes chargé de mener une réunion d'affaire av...   Vous proposez que la réunion se déroule en françai...   3
7   Lors d'une visite guidée de Calgary, le guide tour...   Vous levez la main pendant la visite pour corriger...   1
7   Lors d'une visite guidée de Calgary, le guide tour...   Vous ne dites rien tout de suite, mais vous ne man...   2
7   Lors d'une visite guidée de Calgary, le guide tour...   Vous retournez à vos courriels sur votre téléphone...   3
8   Vous venez de vous acheter un ordinateur portable ...   Vous gardez l'anglais comme langue principale.  1
8   Vous venez de vous acheter un ordinateur portable ...   Vous gardez l'anglais pour l'instant, histoire de ...   2
8   Vous venez de vous acheter un ordinateur portable ...   Vous réinstallez le disque immédiatement et choisi...   3
9   Vous discutez en anglais au téléphone avec un prép...   Vous lui proposez de revenir à l'anglais.   1
9   Vous discutez en anglais au téléphone avec un prép...   Vous prenez votre mal en patience, et lorsque vous...   2
9   Vous discutez en anglais au téléphone avec un prép...   Vous continuez la conversation en français mais vo...   3
10  Alors que vous faites vos courses, un homme vous d...   Vous atténuez quelque peu les propos du client, qu...   1
10  Alors que vous faites vos courses, un homme vous d...   Vous demandez au client de se trouver un(e) autre ...   2
10  Alors que vous faites vos courses, un homme vous d...   Vous traduisez ses propos tels quels, en soulignan...   3

Right now I'm using two separate database calls to accomplish the questions and the answers retrieval. I know this is not optimal and can be done with an SQL join somehow.

Here is the current SQL for the questions:

SELECT * FROM questions Q ORDER BY Q.order

and the answers:

SELECT * FROM reponses R WHERE R.fk_question = $questionId ORDER BY R.order

Using this SQL I can get all the answers returned, but then I lose the actual question...

SELECT
  *
FROM
  questions Q
  LEFT JOIN reponses R
    ON Q.id = R.fk_question
ORDER BY
  Q.order

The ideal response would be one row by question, with a column containing an array listing the answers...

im opened to changing the db structure, or sql calls... ive been able to get the 1row per question and a column listing all the answers by using this sql:

SELECT Q.id,Q.text, GROUP_CONCAT(R.text), R.order AS rorder
FROM `questions` Q
LEFT JOIN reponses R ON Q.id = R.fk_question 
GROUP BY Q.id

but not too sure if this format is best after all... id need to deal with the commas in text field and do the converting to an actual array in php...

for now having two separate calls seems clearer and works...

This is my first post on this site so let me know if anything is unclear and thanks a lot in advance!

Pred
  • 8,789
  • 3
  • 26
  • 46
ulumi
  • 63
  • 1
  • 8
  • Welcome to Stack Overflow. Can you add the structure of your two tables to your question please? – Styphon Aug 27 '14 at 13:45
  • How do you lose the question? You should get n rows per question where n in the number of responses per question. Each row will have the question (along with a distinct response). – TJ- Aug 27 '14 at 13:47
  • 1
    This sort of thing is doable. Check out [GROUP_CONCAT](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) in the MySQL docs. – Andy Aug 27 '14 at 13:49
  • I am able to get "3 rows per question" (3 being the amount of answers available) - but either need to know how to deal with the display of data in this format, or need to format the data in a way that I can easily display it in php with a for each loop... ideally one row per question, and a column containing an array for the answers. – ulumi Aug 27 '14 at 13:58
  • can you post some of the data in your tables for us to work with? – John Ruddell Aug 27 '14 at 13:59
  • posted some data... sorry for losing the table format... – ulumi Aug 27 '14 at 14:15
  • 1
    It sounds like you're looking to pivot the data. There's a good example here: http://stackoverflow.com/questions/7674786/mysql-pivot-table – BReal14 Aug 27 '14 at 14:33
  • thanks all for your help, it seems like there is no downside to making two calls in this situation, so ill leave it as is but i appreciate your cues and will be keeping those in mind for next projects. enjoy your day! – ulumi Aug 27 '14 at 17:41

0 Answers0