现在我的问题是,如果我有一个调查问题表,一个调查选择表和一个用户对这些调查问题的答案表,我将如何在同一查询中选择调查问题以及该调查的所有选项?
问题表
question_id (int)
question (text)
Run Code Online (Sandbox Code Playgroud)
选择表
choice_id (int)
question_id (int)
choice_text (varchar)
Run Code Online (Sandbox Code Playgroud)
答案表
answer_id (int)
question_id (int)
choice_id (int)
Run Code Online (Sandbox Code Playgroud)
我应该做什么SELECT才能在同一个查询中获得调查问题以及该调查的所有选择(已知或未知数量)?(如果可能的话,也可以在同一个查询中找到我的其他问题中的数学运算)
我不是那么先进的MySQL.
谢谢
编辑: 对不起,我的意思是,我正在尝试获取一个SELECT语句来选择问题,以及与该问题相对应的所有选项,在一行中.
如果我做的事情
SELECT question_id, question, choice_id, choice_text FROM questions LEFT JOIN choices USING(question_id)
Run Code Online (Sandbox Code Playgroud)
我得到多行,每个choice_id一行.
结果应该是这样的
question choice_1 choice_2 choice_3
A or B or C A B C
Run Code Online (Sandbox Code Playgroud)
数学部分将结果统计到调查中,是的,如果有帮助,choice_id是PK.
要获取问题和每个问题的选择:
SELECT question, choice_text
FROM questions
JOIN choices
ON questions.question_id = choices.question_id
Run Code Online (Sandbox Code Playgroud)
如果您还想要没有选择的问题,请在 JOIN 之前添加 LEFT。
要获取每个答案的计数,您可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
要获取选择每个答案的人数百分比(每个问题),请使用以下查询:
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;
Run Code Online (Sandbox Code Playgroud)
这是我使用的测试数据:
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);
Run Code Online (Sandbox Code Playgroud)
我最后一次查询该数据得到的输出:
'Foo?', 'Foo1', 66.6667
'Foo?', 'Foo2', 0.0000
'Foo?', 'Foo3', 33.3333
'Bar?', 'Bar1', 50.0000
'Bar?', 'Bar2', 50.0000
Run Code Online (Sandbox Code Playgroud)
在问题的更新中,您说您想要返回一行中一个问题的所有值。我建议您不要尝试这样做,而是使用我上面给您的方法。如果您需要将一行数据呈现给最终用户,可以使用 PHP 来完成。