2010-01-22 5 views
7

I asked a question yesterday sull'utilizzo di MySQL per calcolare i risultati di un sondaggio.Come selezionare più campi nella stessa riga? (MySQL)

Ora la mia domanda è: se avessi una tabella di domande del sondaggio, una tabella di sondaggi e una tabella di risposte degli utenti a quelle domande del sondaggio, come selezionerei la domanda del sondaggio insieme a tutte le scelte per quel sondaggio all'interno della stessa query?

Domande Tabella

question_id (int) 
question (text) 

Scelte Tabella

choice_id (int) 
question_id (int) 
choice_text (varchar) 

risposte Tabella

answer_id (int) 
question_id (int) 
choice_id (int) 

Cosa SELEZIONA devo fare per ottenere la domanda del sondaggio insieme a tutte le scelte per quella indagine (importo conosciuto o sconosciuto) tutti nella stessa query? (se possibile, anche fare i calcoli, trovato nella mia altra domanda, all'interno della stessa query)

Non sono così avanzato con MySQL.

Grazie

EDIT: Siamo spiacenti, Volevo dire, sto cercando di ottenere una dichiarazione SELECT per selezionare la domanda, e tutte le scelte che corrisponde a questa domanda, in una riga.

Se faccio qualcosa di simile

SELECT question_id, question, choice_id, choice_text FROM questions LEFT JOIN choices USING(question_id) 

ottengo più righe, una per ogni choice_id.

I risultati dovrebbero essere qualcosa di simile

question  choice_1 choice_2 choice_3 
A or B or C  A   B  C 

La parte matematica è contando i risultati del sondaggio, e sì, il choice_id è un PK, se questo aiuta.

+0

Volete solo i chocies o anche i conteggi? Qual è la tua "altra domanda" e che cosa "matematica" vuoi fare? –

+0

Non stai cercando informazioni sulla risposta corretta? Solo le domande/possibilità di scelta? –

+0

@ Evan: è un sondaggio, non un test - non c'è una risposta corretta. – Martha

risposta

4

Per ottenere le domande e le scelte per ogni domanda:

SELECT question, choice_text 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 

Add a sinistra prima ENTRA se si vuole anche domande che non hanno scelte.

Per ottenere i conteggi per ogni risposta si potrebbe fare questo:

SELECT question, choice_text, COUNT(answers.choice_id) 
FROM questions 
JOIN choices 
    ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id 

Per ottenere il numero di persone che hanno selezionato ogni risposta in percentuale (per ogni domanda) utilizzare la seguente query:

SELECT question, choice_text, COUNT(answers.choice_id) * 100/questiontotal 
FROM questions 
JOIN (
     SELECT questions.question_id, COUNT(answers.choice_id) AS questiontotal 
     FROM questions 
     LEFT JOIN answers ON questions.question_id = answers.question_id 
     GROUP BY questions.question_id 
    ) AS answercounts 
    ON questions.question_id = answercounts.question_id 
JOIN choices ON questions.question_id = choices.question_id 
LEFT JOIN answers 
    ON questions.question_id = answers.question_id 
    AND choices.choice_id = answers.choice_id 
GROUP BY questions.question_id, choices.choice_id 
ORDER BY questions.question_id, choices.choice_id; 

Ecco il testdata ho usato:

CREATE TABLE questions (question_id int, question nvarchar(100)); 
INSERT INTO questions (question_id, question) VALUES 
(1, 'Foo?'), 
(2, 'Bar?'); 

CREATE TABLE choices (choice_id int, question_id int, choice_text nvarchar(100)); 
INSERT INTO choices (choice_id, question_id, choice_text) VALUES 
(1, 1, 'Foo1'), 
(2, 1, 'Foo2'), 
(3, 1, 'Foo3'), 
(4, 2, 'Bar1'), 
(5, 2, 'Bar2'); 

CREATE TABLE answers (answer_id int, question_id int, choice_id int); 
INSERT INTO answers (answer_id, question_id, choice_id) VALUES 
(1, 1, 1), 
(2, 1, 1), 
(3, 1, 3), 
(4, 2, 4), 
(4, 2, 5); 

E l'uscita ottengo con l'ultima query su questi dati:

'Foo?', 'Foo1', 66.6667 
'Foo?', 'Foo2', 0.0000 
'Foo?', 'Foo3', 33.3333 
'Bar?', 'Bar1', 50.0000 
'Bar?', 'Bar2', 50.0000 

Nell'aggiornamento alla domanda si dice di voler restituire tutti i valori per una domanda su una riga.Ti consigliamo di fare non provare a farlo, e invece utilizzare il metodo che ti ho dato sopra. Se hai bisogno di presentare i dati in una riga al tuo utente finale, questo può essere fatto usando PHP.

0
SELECT questions.question_id, questions.question, choices.choice_id, choices.question_id 
FROM questions, choices 
WHERE questions.question_id = choices.question_id 
AND questions.question_id = "Something" 

Dovrebbe funzionare, credo.

2

Si noti che la tabella Answers probabilmente non ha bisogno della colonna QuestionID.

Questo ti porterà il testo della domanda, il testo di scelta e il numero di risposte per scelta.

SELECT Questions.question, Choices.choice_text, Count(Answers.*) AS N 
FROM Questions INNER JOIN Choices ON Questions.question_id = Choices.question_id 
    LEFT JOIN Answers ON Choices.choice_id = Answers.choice_id 
GROUP BY Questions.question_id, Choices.choice_id 

Edit: a meno che non sei molto, molto bravo a SQL, è probabilmente meglio di dimenticare il "tutto una riga" parte - a meno che il numero di scelte per questione non è solo conosciuta, ma costante, e anche in quel caso, non è facile. È davvero un problema di visualizzazione, quindi affrontalo quando visualizzi i risultati.

+0

+1 per il consiglio contro la parte "tutte una riga". –

+0

E vorrei poter dare un altro +1 per indicare la colonna QuestionID non necessaria. –

+0

Purtroppo la tua richiesta sembra non funzionare per me. Ottengo 'Hai un errore nella sintassi SQL; controlla il manuale corrispondente alla tua versione del server MySQL per la sintassi corretta da utilizzare vicino a * * AS N FROM Domande JOIN INTERNO Scelte ON Questions.question_id = Choices.q 'alla riga 1 –

3

Vorrei suggerire la risposta di Mark Byers, anche se in teoria se ne avete bisogno "tutto in una riga" solo per scopi di visualizzazione ma non come parte di una routine PHP che potete fare.

SELECT question, GROUP_CONCAT(choice_text) as choice_texts 
FROM questions 
JOIN choices 
ON questions.question_id = choices.question_id 
GROUP BY question; 

L'uscita sarebbe

'Foo?', 'Foo1,Foo2,Foo3' 
'Bar?', 'Bar1,Bar2' 

Nota 'foo1, foo2, Foo3' verrebbe restituito come una colonna non tre colonne, e group_concat ha un massimo di 1024 caratteri nella sua uscita di default però può essere aumentato Non è consigliabile se i risultati potrebbero essere grandi