LEFT JOIN返回空结果集
我遇到了连接的小逻辑问题。我有一个数据库来回答问题。该模式是: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'
我的逻辑出错了?
尝试留下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
为什么在连接中的user_id? – 2012-04-13 12:00:12
@DevinDixon它可以作为JOIN条件或作为WHERE子句的一部分工作。当它处于JOIN状态时,它意味着MySQL在该JOIN条件之前过滤该条件,这可能会使其效率更高。为了找出哪个更适合您,您需要将它们与您的数据进行基准比较。 – liquorvicar 2012-04-13 12:05:16
我正在使用Postgresql,我发现它不在WHERE子句中的位置,只有在JOIN子句中,这就是我问的原因。 – 2012-04-13 12:13:53
取未通过用户与用户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
而是加入了问题,而使用子查询。这是你如何在MS SQL中完成的 - 你可能需要调整MySQL。
SELECT * FROM questions WHERE question_id NOT IN (
SELECT question_id FROM responses WHERE user_id = 1
)
左连接,您需要检查右表中的值可能会导致您头痛。我发现查询这种特定类型的查询更容易和更可靠。
哪个更快?那样的方式还是离开了联接? – 2012-04-13 11:58:40
显然是LEFT JOIN ...除非没有其他选项,否则不推荐SubQuery .. – Chandresh 2012-04-13 12:01:17
更快的表演? – 2012-04-13 12:01:56
试试这个:
Select *
from Question
where question_id not in (select question_id from Responses where user_id=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
);
使用,其中在端部将导致过滤所得空两个表尝试此
SELECT * FROM questions
LEFT JOIN responses ON questions.question_id = responses.question_id AND
user_id != '1'
。
为什么你在'Question'和'Answers'表中有一个单独的'Responses'表,而不是输入'user_id'? – 2012-04-13 11:57:08
@Clodoaldo:它根本不是一个好的数据库练习......因为1个问题可以有多个答案.. – Chandresh 2012-04-13 11:59:32
@Chandresh然后会有'1'个问题给'N'个答案。问题是什么? – 2012-04-13 12:02:59