2012-04-13 142 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'