0

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

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 个查询还是更多?

4

2 回答 2

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

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

这有帮助吗?

于 2012-08-23T00:30:32.560 回答
1

我还发现了另一种返回我需要的所有数据的方法,包括每个问题的用户详细信息:

SELECT 
    question, 
    group_concat(qa.answer SEPARATOR ',') as answers,
    group_concat(qa.user_id SEPARATOR ',') as userIds,
    group_concat(up.nickname SEPARATOR ',') as nickname
FROM quize_questions qq
INNER JOIN question_answers qa ON qa.question_id=qq.question_id
INNER JOIN user_profile up ON up.user_id = qa.user_Id
GROUP BY qq.question_id

我只是不确定这是否是正确的方法。我担心速度。

于 2012-08-23T09:25:28.827 回答