如何按type_id分组查询关联表的问题与答案,且避免多表重复连接?
按type_id筛选问题并关联答案的SQL方案
数据表结构
questions表
id | question | type_id 1 | Q1 | 1 2 | Q2 | 3 3 | Q3 | 1 4 | Q4 | 2
answers表
id | answer 1 | A1 2 | A2 3 | A3
questions_answers表
id | question_id | answer_id 1 | 1 | 1 2 | 2 | 3 3 | 3 | 1
需求与当前问题
需要筛选指定type_id的问题,并关联对应的答案,同时明确每个问题的归属类型。当前使用的查询仅按问题ID分组,无法区分type_id,也达不到筛选指定类型并展示对应问答的效果。
解决方案
不需要重复连接questions表,只需在查询中添加WHERE条件筛选type_id,同时选择需要展示的字段即可:
SELECT q.question, a.answer, q.type_id FROM questions q JOIN questions_answers qa ON qa.question_id = q.id JOIN answers a ON qa.answer_id = a.id WHERE q.type_id = 1;
执行结果
question | answer | type_id Q1 | A1 | 1 Q3 | A1 | 1
如果不需要显示type_id,去掉对应字段即可得到目标结果:
SELECT q.question, a.answer FROM questions q JOIN questions_answers qa ON qa.question_id = q.id JOIN answers a ON qa.answer_id = a.id WHERE q.type_id = 1;
扩展说明
如果需要按type_id分组汇总(比如每个类型下的所有问答集合),可以配合GROUP_CONCAT实现:
SELECT q.type_id, GROUP_CONCAT(CONCAT(q.question, ':', a.answer) SEPARATOR '; ') AS qa_pairs FROM questions q JOIN questions_answers qa ON qa.question_id = q.id JOIN answers a ON qa.answer_id = a.id GROUP BY q.type_id;
内容的提问来源于stack exchange,提问作者mmdev
相关产品推荐
相关产品推荐

