2010-09-09 134 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