2011-11-25 42 views
2

我有一個問題表,其中包含與特定用戶提交的答案對應的行的唯一問題和答案表。我想要做的是創建一個查詢,爲每個問題返回一行,幷包含登錄用戶的答案。如果用戶還沒有回答問題,答案欄應該爲該問題顯示NULL。查詢必須爲每個問題返回一行,而不管用戶是否回答了該問題,並且不應返回任何其他用戶的答案。這個結果集是可能的左或右連接?

這裏是我的表:

CREATE TABLE IF NOT EXISTS `questions` (
`id` int(10) unsigned NOT NULL auto_increment, 
`question` text NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 

CREATE TABLE IF NOT EXISTS `answers` (
`fb_user` int(3) unsigned NOT NULL, 
`question_id` int(10) unsigned NOT NULL, 
`answer` text NOT NULL, 
UNIQUE KEY `fb_user` (`fb_user`,`question_id`) 
) ENGINE=InnoDB; 

目前我使用兩個查詢,使這項工作:

CREATE TEMPORARY TABLE answers_f SELECT * from answers WHERE fb_user = '$fb_profile_id' 
SELECT questions.*, answers_f.* FROM answers_f RIGHT JOIN questions ON questions.id = answers_f.question_id ORDER BY questions.id 

問題?有沒有辦法只用一個左或右連接查詢,可能是一個子查詢或多個連接,而不必像上面所做的那樣創建臨時表?

回答

5

要將它寫爲單個查詢,您需要將用戶名作爲連接條件的一部分進行測試,而不是將其作爲WHERE子句進行測試。

SELECT 
    questions.id, 
    questions.question, 
    answers.answer 
FROM questions 
LEFT JOIN answers 
ON question_id = questions.id 
AND fb_user = 'foobar' 
ORDER BY questions.id 
+0

完美。你確切地把問題掛鉤了。我在你的解決方案中使用了WHERE而不是AND。謝謝! – Snazawa