我有很多用户填写的表单。每个表单都包含一个问题列表。在第一个表中是表单ID和问题的ID。
form_id | question_id
1 | 1
1 | 2
1 | 3
2 | 4
2 | 5
这个表有两个表格,一个有3个问题,另外两个2.我有第二个表格,其中包含用户为问题提供的答案。
user_id | form_id | question_id | answer
476 | 1 | 1 | "answer1"
476 | 1 | 3 | "answer2"
693 | 1 | 1 | "answer3"
693 | 1 | 2 | "answer4"
235 | 2 | 5 | "answer5"
在此示例中,2个用户填写了表单1,1个用户填写了表单2.但没有人填写所有问题。是否可以编写一个结合了两个表的查询,并给出用户给出的答案,包括他们没有回答的问题?我希望结果看起来像这样。
user_id | form_id | question_id | answer
476 | 1 | 1 | "answer1"
476 | 1 | 2 | NULL
476 | 1 | 3 | "answer2"
693 | 1 | 1 | "answer3"
693 | 1 | 2 | "answer4"
693 | 1 | 3 | NULL
235 | 2 | 4 | NULL
235 | 2 | 5 | "answer5"
当我像这样使用左连接时我遇到的问题
select * from template t
left join answers a on a.template_id = t.template_id
AND a.question_id = t.question_id
AND t.template_id = t.template_id;
是结果的行缺少user_id。
答案 0 :(得分:1)
是的,查询可以返回指定的结果。
实现此目的的一种方法是连接到内联视图,并对第二个表进行“外连接”操作。
“技巧”是使用查询从第二个表中获取不同的user_id和form_id列表,例如:
SELECT user_id, form_id
FROM second_table
GROUP BY user_id, form_id
然后将该查询用作内联视图(将其包装在parens中,分配表别名,并引用它,就像它是外部查询中的表一样。
之后所需的只是第二个表的“外连接”。
例如:
SELECT r.user_id
, q.form_id
, q.question_id
, a.answer
FROM first_table q
JOIN ( SELECT p.user_id, p.form_id
FROM second_table p
GROUP BY p.user_id, p.form_id
) r
ON r.form_id = q.form_id
LEFT
JOIN second_table a
ON a.user_id = r.user_id
AND a.form_id = r.form_id
AND a.question_id = q.question_id
ORDER
BY r.user_id
, q.form_id
, q.question_id
请注意,关键字“LEFT”指定外部联接操作,从左侧返回所有行,并从右侧返回匹配的行。典型的“内部”连接将排除未在右侧表中找到匹配行的行。
答案 1 :(得分:0)
使用
left join
类似的东西:
select * from table1 left join table2 on table1.form_id= table2.form_id