我需要获取测验标题、测验描述、测验问题以及每个问题的答案。我的表结构是:
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/