2010-09-09 7 views
1

Je fais un Q & Un site, similaire à ce site et Yahoo réponses. J'ai 3 tables - smf_members, qa_questions et qa_answers.Coincé avec une requête de jointure SQL

Dans cette requête, je veux sélectionner quelques champs de qa_questions, quelques champs de smf_members et le nombre d'enregistrements dans ga_answers pour le question_id. C'est ainsi que je peux avoir quelques informations de base sur la question, quelques informations de base sur le membre, et le nombre de réponses.

Ceci est la requête que j'ai produite jusqu'à présent et cela fonctionne presque, mais ne retourne pas les questions avec lesquelles il n'y a pas de réponses (c'est-à-dire pas d'enregistrements dans la table réponses pour ce question_id).

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

connexes: http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html –

Répondre

7

Utilisez LEFT OUTER JOIN sur la table qa_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

Cela semble faire exactement la même chose que ma requête en cours. Je viens aussi de remarquer que ces deux requêtes ne retournent qu'une seule question. Si j'ajoute plus de réponses (pour différents ID de question), cela augmente simplement le nombre de réponses de la question retournée. – Matt

+0

@Matt: 'qa_answers' est joint par' question_id', donc le nombre de réponses pour une question quand les réponses sont ajoutées à une autre question ne peut pas augmenter à cause de cela. Vous pouvez trouver des questions supplémentaires ne montrant pas si 'q.q.question_author' est nulle ou s'il n'y a pas de valeur correspondante dans' m.id_member'. – RedFilter

+0

La partie membres devrait convenir, car j'utilise le même ID auteur pour toutes les questions + réponses. Lorsque j'ajoute des réponses à une question existante, toutes les réponses sont ajoutées à la question qui s'affiche. Si j'ajoute une réponse à une question inexistante, le nombre de réponses n'augmente pas. Pourriez-vous éventuellement examiner votre requête et suggérer des modifications qui pourraient vous aider? C'est un peu hors de ma profondeur maintenant, et je ne suis pas trop sûr de ce qui se passe avec les jointures .. =/ – Matt

0

Une réponse précédente de la mine pourrait aider, même si elle n'a pas obtenu des votes ou accepté il est donc probablement sans valeur: P

MySQL Left Join with conditional

+0

Bon courage, je vais essayer de modifier cela à mon installation si je ne peux pas obtenir ce qui précède fonctionne. – Matt

2

Vous avez besoin d'une clause GROUP BY pour regrouper le nombre de réponses par question

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

Oh mon .. qui a parfaitement fonctionné, merci beaucoup! Maintenant, je ne sais pas lequel choisir comme réponse. – Matt

Questions connexes