我需要获得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个查询还是更多?
答案 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
我不确定这是不是正确的方法。我担心速度。