dongtun2459 2010-01-22 22:41
浏览 119
已采纳

如何在同一行中选择多个字段? (MySQL的)

I asked a question yesterday about using MySQL to tally results to a survey.

Now my question is, if I had a table of survey questions, a table of survey choices, and a table of users answers to those survey questions, how would I select the survey question along with all the choices for that survey within the same query?

Questions Table

question_id (int)
question (text)

Choices Table

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

Answers Table

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

What SELECT should I do to get the survey question along with all the choices for that survey (known or unknown amount) all in the same query? (if possible, also do the math, found in my other question, within the same query)

I'm not so advanced with MySQL.

Thanks

EDIT: Sorry, What I meant was, I'm trying to get a SELECT statement to select the question, and all the choices corresponding to that question, in one row.

If I do something like

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

I get multiple rows, one for each choice_id.

The results should be something like

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

The math part is tallying up the results to the survey, and yes, the choice_id is a PK, if that helps.

  • 写回答

4条回答 默认 最新

  • duan1226 2010-01-22 22:45
    关注

    To get the questions and the choices for each question:

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

    Add LEFT before JOIN if you also want questions that have no choices.

    To get the counts for each answer you could do this:

    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
    

    To get the number of people that selected each answer as a percentage (per question) use the following 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;
    

    Here's the testdata I used:

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

    And the output I get with the last query on this data:

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

    In the update to your question you say you want to return all the values for one question on one row. I would recommend that you do not try to do this, and instead use the method I have given you above. If you need to present the data in one row to your end-user, this can be done using PHP.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料