查询根据另一个表创建缺失的行

时间:2014-09-22 18:02:32

标签: mysql sql

我有很多用户填写的表单。每个表单都包含一个问题列表。在第一个表中是表单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。

2 个答案:

答案 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