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/

相关文章:

php - Mysql 特殊字符自然排序

mysql - INSERT INTO... 具有不存在值的 VALUES

sql - 如何用 R 分析维基百科文章数据库?

sql - 我如何调整此 SQL 以仅执行一次算术计算

mysql - 连接返回空值?

javascript - Order By (alias) then Order by second sequelize

ON 子句中的 MySQL 未知列不起作用

sql-server - 建模资源所有权的最佳方式

php - 用于库存管理的 MySQL 选择查询

php - 我正在尝试使用 post 方法将变量从 PHP 传递到 HTML,但它对我不起作用