MySQL连接表仅用于查找先前连接的缺失值

时间:2013-11-20 15:37:13

标签: mysql sql join

很抱歉,如果我的标题很奇怪,但我甚至不确定如何在这个描述中说出我的问题,更不用说简短的标题了。

我们有1000个用户。其中400个是新的。其中500人已使用我们添加的新字段更新了他们的个人资料。 100没有更新他们的个人资料。

当我尝试在特定字段上提取数据时,我得到900个结果。

Select j1.question, j1.response
FROM table1 t1
JOIN table2 j1 on t1.id_user = j1.iduser AND j1.idquestion IN (26)

缺少使用新配置文件问题未更新其个人资料的100位用户。

当我尝试在特定字段中提取数据以包含类似的旧配置文件问题时,我得到1500个结果。

Select j1.question, j1.response
FROM table1 t1
JOIN table2 j1 on t1.id_user = j1.iduser AND (j1.idquestion IN (26) OR j1.idquestion IN (8))

这将从26中获得900个结果,而从原来的600个用户中获得8个结果。

所以我的问题是,我如何才能得到id(12)的问题数据,然后从id(1)中得到剩下的100?

2 个答案:

答案 0 :(得分:2)

这将为您提供第一个查询中“丢失”的100个用户。我不确定我用quesionID(8)了解你想要什么。

         SELECT t1.question, t1.response
           FROM table1 t1
LEFT OUTER JOIN table2 j1 on t1.id_user = j1.iduser 
            AND j1.idquestion IN (26)
          WHERE j1.iduser IS NULL

答案 1 :(得分:1)

SELECT IF(q26.question IS NOT NULL, q26.question, q8.question) as question, IF(q26.response IS NOT NULL, q26.response, q8.response) as response
FROM table1 t1
LEFT JOIN table2 as q26
ON 
(t1.id_user = q26.iduser
AND q26.idquestion = 26)
LEFT JOIN table2 as q8
ON
(t1.id_user = q8.iduser
AND q8.idquestion = 8);

这应该有效。从table1开始,左连接可确保您为每个用户获得一个答案。加入q26将加入q26值(如果存在),否则为null。加入q8将在其他列中执行相同操作。

你最终得到table1,其中一些列只适用于question26(或null),后面跟着只适用于问题8(或null)的列。然后,如果在选择中使用IF(),则可以选择正确的列。