mysql - 在 1 个查询中获取测验数据、问题和答案?

标签 mysql sql database

我需要获取测验标题、测验描述、测验问题以及每个问题的答案。我的表结构是:

quizes
quize_id | title | user_id | ...

questions
questions_id | quize_id | question | ...

question_answers
answer_id | question_id | user_id | answer | ...

我可以使用加入

SELECT * FROM quizes JOIN questions q ON q.quize_id=quizes.quize_id JOIN question_answers a ON a.question_id=q.question_id

但这样做的问题是,我会得到许多包含冗余数据的行。例如,每一行将携带字段 title、user_id... 另一种方法是对每个问题进行额外查询以获得答案。还有更好的办法吗?我应该只使用 1 个或更多查询吗?

最佳答案

您的表包含 3 种类型的数据。如果您使用已有的查询,您将获得一个大表中的所有数据。您说过这涉及大量重复。

如果您使用多个查询,您将获得多个结果集,这实际上会给您留下多个表,因此这不太可能有帮助。

您可以将查询缩减为您想要获取数据的列:

SELECT qq.Question, qa.Answer
FROM quizes qz 
  join questions qq on qz.quize_id = qq.quize_id 
  join question_answers qa on qq.question_id = qa.question_id
WHERE qz.quize_id = @quize_id
ORDER BY 1, 2  --or other ordering

但是,如果同一问题有多个答案,则该问题将在每一行重复。您对此无能为力,这是将多个表的数据合并到一个表中的代价(“非规范化”)。

如果您需要格式化输出表,使其看起来像这样(但包含更多列):

    Quize_id | Question | Answer
    1          Q1         A1
                          A2
               Q2         A3
    2          Q3         A4

这是完全不同的事情。您需要使用必须填充临时表的查询,并按您想要显示的排序顺序对数据进行排序。您需要向该表添加主键(整数)列,然后运行一组更新语句以用空值替换重复值,然后按主键列的顺序输出表。 (还有其他方法可以做到这一点,但这是最容易解释的)

这有帮助吗?

关于mysql - 在 1 个查询中获取测验数据、问题和答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081611/

相关文章:

java - 打开联系意向DISPLAY_NAME

php - 按匹配标签的最大数量对 Codeigniter 查询结果进行排序

mysql - yii\db\Command 类的对象无法转换为字符串

MySQL AS in WHERE 语句

sql - 如何将数据从 iSQL 输出到带有_标题的 csv 文件?

sql - 验证 dbms_sql.execute 执行的代码 PL/SQL

mysql - 为什么我的 MySql 查询没有返回我想要的返回行?

mysql - 匹配mySQL中两条记录中的值

android - 将Android App与本地机器上存储的Mysql数据库连接

通过规范化与经验/意见的数据库表