2012-04-13 141 views
2

我遇到了连接的小逻辑问题。我有一个数据库来回答问题。该模式是:LEFT JOIN返回空结果集

Question 
question_id 
question_text 

Answers 
answer_id 
question_id 
answer_text 

User Responses 
user_id 
answer_id 
question_id 

我想找到一个用户还没有回答的问题,但我不断收到空响应。查询如下:

SELECT * FROM questions 
    LEFT JOIN responses ON questions.question_id = responses.question_id 
WHERE user_id != '1' 

我的逻辑出错了?

+1

为什么你在'Question'和'Answers'表中有一个单独的'Responses'表,而不是输入'user_id'? – 2012-04-13 11:57:08

+0

@Clodoaldo:它根本不是一个好的数据库练习......因为1个问题可以有多个答案.. – Chandresh 2012-04-13 11:59:32

+2

@Chandresh然后会有'1'个问题给'N'个答案。问题是什么? – 2012-04-13 12:02:59

回答

2

尝试留下JOIN IS NULL

SELECT q.question_id FROM questions q 
    LEFT JOIN responses r ON q.question_id = r.question_id AND r.user_id = 1 
WHERE r.question_id IS NULL 
+0

为什么在连接中的user_id? – 2012-04-13 12:00:12

+0

@DevinDixon它可以作为JOIN条件或作为WHERE子句的一部分工作。当它处于JOIN状态时,它意味着MySQL在该JOIN条件之前过滤该条件,这可能会使其效率更高。为了找出哪个更适合您,您需要将它们与您的数据进行基准比较。 – liquorvicar 2012-04-13 12:05:16

+0

我正在使用Postgresql,我发现它不在WHERE子句中的位置,只有在JOIN子句中,这就是我问的原因。 – 2012-04-13 12:13:53

2

取未通过用户与用户ID回答使用左侧的1

SELECT * FROM questions 
    LEFT JOIN responses ON questions.question_id = responses.question_id 
WHERE responses.question_id IS NULL AND user_id = 1 
1

而是加入了问题,而使用子查询。这是你如何在MS SQL中完成的 - 你可能需要调整MySQL。

SELECT * FROM questions WHERE question_id NOT IN (
    SELECT question_id FROM responses WHERE user_id = 1 
) 

左连接,您需要检查右表中的值可能会导致您头痛。我发现查询这种特定类型的查询更容易和更可靠。

+0

哪个更快?那样的方式还是离开了联接? – 2012-04-13 11:58:40

+0

显然是LEFT JOIN ...除非没有其他选项,否则不推荐SubQuery .. – Chandresh 2012-04-13 12:01:17

+0

更快的表演? – 2012-04-13 12:01:56

0

试试这个:

Select * 
from Question 
where question_id not in (select question_id from Responses where user_id=1) 
1

另一种可能性是EXISTS半联接。

SELECT * 
FROM questions q 
WHERE NOT EXISTS (
    SELECT * 
    FROM responses r 
    WHERE r.question_id = q.question_id 
    AND r.user_id = 1 
    ); 
0

使用,其中在端部将导致过滤所得空两个表尝试此

SELECT * FROM questions 
LEFT JOIN responses ON questions.question_id = responses.question_id AND 
user_id != '1'