2010-09-09 110 views
1

我正在做一個Q &一個網站,類似於這個網站和雅虎的答案。我有3個表格 - smf_members,qa_questions和qa_answers。插入SQL連接查詢

在此查詢中,我想從qa_questions中選擇一些字段,smf_members的幾個字段以及用於question_id的ga_answers中的記錄數。這樣我就可以得到關於這個問題的一些基本信息,關於該成員的一些基本信息以及答案的數量。

這是我迄今爲止製作的查詢,它幾乎可以工作,但不會返回沒有答案的問題(即此答案的答案表中沒有記錄)。

SELECT qa_questions.question_id, 
     qa_questions.question_title, 
     qa_questions.question_content, 
     qa_questions.time_asked, 
     qa_questions.question_author, 
     qa_questions.votes, 
     qa_questions.views, 
     qa_questions.pretty_url, 
     smf_members.real_name, 
     smf_members.id_member, 
     COUNT(qa_answers.question_id) AS answers 
FROM qa_questions, 
     qa_answers, 
     smf_members 
WHERE qa_questions.deleted = 0 
     AND smf_members.id_member = qa_questions.question_author 
     AND qa_answers.question_id = qa_questions.question_id 
ORDER BY qa_questions.time_asked DESC 
LIMIT 10 
+3

相關:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – 2010-09-09 21:04:48

回答

7

使用LEFT OUTER JOINqa_answers表:

SELECT q.question_id, 
    q.question_title, 
    q.question_content, 
    q.time_asked, 
    q.question_author, 
    q.votes, 
    q.views, 
    q.pretty_url, 
    m.real_name, 
    m.id_member, 
    COUNT(a.question_id) as answers 
FROM qa_questions q 
inner join smf_members m on m.id_member = q.question_author 
left outer join qa_answers a on a.question_id = q.question_id 
WHERE q.deleted = 0 
ORDER BY q.time_asked DESC 
LIMIT 10 
+0

這似乎與我當前的查詢完全相同。我也只注意到這兩個查詢都只返回一個問題。如果我添加更多答案(針對不同的問題ID),它只會增加一個返回問題的答案數。 – Matt 2010-09-09 21:11:37

+0

@Matt:'qa_answers'正在通過'question_id'加入,所以當答案被添加到另一個問題時,對於一個問題的回答數量不能因此而增加。如果'q.q.question_author'爲null或者'm.id_member'中沒有匹配的值,您可能會發現其他問題沒有顯示。 – RedFilter 2010-09-09 21:20:49

+0

成員部分應該沒問題,因爲我對所有問題+答案都使用相同的作者ID。當我爲任何問題添加答案時,所有答案都會添加到顯示的一個問題中。如果我爲不存在的問題添加答案,則答案數不會增加。你可能會審查你的查詢,並建議可能有幫助的任何變化?這有點超出我的深度,而且我不太清楚連接的情況.. =/ – Matt 2010-09-09 21:39:26

0

我的一個以前的答案可能會幫助,但沒有得到任何選票或接受所以它可能一文不值:P

MySQL Left Join with conditional

+0

好吧歡呼,我會嘗試修改,如果我無法得到上述工作,我的設置。 – Matt 2010-09-09 21:32:35

2

您需要一個GROUP BY子句來分組每個問題的答案數

... 
GROUP BY q.question_id 
LIMIT 10 
+0

哦,我的..完美的工作,非常感謝你!現在我不知道該選哪個作爲答案.. – Matt 2010-09-09 21:42:10