在1个查询中获取quize数据,问题和答案?

时间:2012-08-22 21:23:25

标签: mysql sql database

我需要获得quize title,quize description,quize问题和每个问题的答案。我的表结构是:

quizes
quize_id | title | user_id | ...

questions
questions_id | quize_id | question | ...

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

我可以使用join

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

但问题是我会在结果中获得许多带有冗余数据的行。例如,每行将携带字段标题,user_id,...另一种方法是为每个问题提供额外的查询以获得答案。有没有更好的方法?我应该只使用1个查询还是更多?

2 个答案:

答案 0 :(得分: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

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

这有帮助吗?

答案 1 :(得分: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

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