2010-01-22 17 views
7

I asked a question yesterday sobre el uso de MySQL para registrar los resultados en una encuesta.¿Cómo seleccionar múltiples campos en la misma fila? (MySQL)

Ahora mi pregunta es, si tuviera una tabla de preguntas de la encuesta, una tabla de opciones de encuestas y una tabla de usuarios respuestas a esas preguntas, ¿cómo seleccionaría la pregunta de la encuesta junto con todas las opciones para esa encuesta? dentro de la misma consulta?

Preguntas Tabla

question_id (int) 
question (text) 

opciones Tabla

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

Respuestas Tabla

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

Lo SELECT debo hacer para conseguir la pregunta de la encuesta junto con todas las opciones para que la encuesta (cantidad conocida o desconocida) ¿todos en la misma consulta? (si es posible, también haga los cálculos, que se encuentran en mi otra pregunta, dentro de la misma consulta)

No estoy tan avanzado con MySQL.

Gracias

EDIT: Lo sentimos, Lo que quería decir, que estoy tratando de conseguir una instrucción SELECT para seleccionar la pregunta, y todas las opciones correspondientes a esa pregunta, en una fila.

Si hago algo así como

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

consigo varias filas, una para cada choice_id.

los resultados deben ser algo así como

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

La parte de matemáticas es llevar la cuenta los resultados de la encuesta, y sí, el choice_id es un PK, si eso ayuda.

+0

¿Desea solo las opciones, o también los conteos? ¿Cuál es su "otra pregunta" y qué "matemáticas" quiere hacer? –

+0

¿No estás buscando información con respecto a la respuesta correcta? ¿Solo las posibilidades de pregunta/elección? –

+0

@Evan: es una encuesta, no una prueba; no hay una respuesta correcta. – Martha

Respuesta

4

Para obtener las preguntas y las opciones para cada pregunta:

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

Agregar a la izquierda antes JOIN si desea también preguntas que no tienen opciones.

llevar los conteos por cada respuesta que podría hacer esto:

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 

Para obtener el número de personas que seleccionaron cada respuesta como porcentaje (por pregunta) utilizar la siguiente consulta:

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; 

Aquí está la testdata utilicé:

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); 

Y la salida llego con la última consulta en estos datos:

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

En la actualización de su pregunta dice que desea devolver todos los valores para una pregunta en una fila.Le recomiendo que haga no intente hacer esto, y en su lugar use el método que le he dado arriba. Si necesita presentar los datos en una fila a su usuario final, esto se puede hacer 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" 

Debería funcionar, creo.

2

Tenga en cuenta que la tabla de Respuestas probablemente no necesita la columna QuestionID.

Esto le dará el texto de la pregunta, el texto de elección y el número de respuestas por elección.

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 

Editar: a menos que seas muy, muy bueno en SQL, que es probablemente la mejor manera de olvidarse de la "toda una fila" parte - a menos que el número de opciones por pregunta no sólo es conocida, pero constante, y incluso en ese caso, no es fácil. Es realmente un problema de visualización, por lo que debes lidiar con él cuando visualices los resultados.

+0

+1 por el consejo contra la parte "todos de una fila". –

+0

Y desearía poder dar otro +1 para señalar la columna QuestionID innecesaria. –

+0

Desafortunadamente, su consulta no parece funcionar para mí. Aparece 'Tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de '*) AS N FROM Questions INNER JOIN Opciones ON Questions.question_id = Choices.q' en la línea 1 –

3

Sugeriría la respuesta de Mark Byers, aunque teóricamente si los necesita "todo en una fila" solo para propósitos de visualización pero no como parte de una rutina de PHP que puede hacer.

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

La salida sería

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

Nota 'foo1, Foo2, foo3' sería devuelto como una columna no tres columnas, y GROUP_CONCAT tiene un máximo de 1024 caracteres en su salida de forma predeterminada, aunque puede ser aumentado No se recomienda si los resultados pueden ser grandes

Cuestiones relacionadas