2010-09-24 5 views
2

Excuses - je ne suis pas bon en SQL. Peut-être que c'est une requête simple - je ne sais pas.Requête SQL qui ressemble à la même table

Ce que j'ai est une table de base de forum - par exemple.

id poster title type content postedon parentID 

dans ce schéma, si un utilisateur pose une question, il est de type = 0, et si elle est une réponse, type = 1. Si l'entrée est une réponse, mettre à jour le parentID à l'ID sur la rangée de questions. Tout ce que je veux faire est de tirer les questions dans une requête SQL, avec un nombre qui a le nombre total de réponses à la question - par exemple. une ligne de résultat ressemblerait

[email protected] "how do I do this?" 4 

Où (4) serait le total des réponses à ma question. Je veux le faire dans une seule requête - sans avoir à tirer les questions d'abord, puis exécuter des requêtes répétées pour chaque question Id pour trouver le nombre de réponses.

Comment faire?

Merci à tous,

(PS - est-il un moyen de faire la requête dans les expressions Linq je le ferais au lieu d'une procédure stockée si je pouvais?)

+0

Voulez-vous voir les questions avec zéro réponses? –

+0

Oui! La réponse de Joe l'a presque fait, et j'ai posté en demandant exactement cela. J'ai besoin de toutes les questions retournées, et ils peuvent avoir 0 ou plusieurs réponses. – jeremy

+0

en outre, votre titre des réponses changeront par rapport au titre de la question. Par exemple: il est possible que le titre ait un Re: XYZ pour un titre original de XYZ ou n'est-ce pas un problème ici? – InSane

Répondre

4
select ft1.poster, ft1.title, count(ft2.id) 
    from ForumTable ft1 
     left join ForumTable ft2 
      on ft1.id = ft2.parentID 
       and ft2.type = 1 
    where ft1.type = 0 
    group by ft1.poster, ft1.title 
+0

Joe - cela semble (presque) le faire. Mais il ne renvoie que les lignes où la question avait une ou plusieurs réponses, mais pas celles qui n'en ont pas (0 réponses) ... que puis-je modifier? – jeremy

+0

essayé, et je reçois un '1' pour toutes les questions qui n'avaient pas de réponses ... (la colonne parentID est rempli avec 0 pour toutes les questions) – jeremy

+0

Ouais, réalisé mon erreur aussi. Vous voulez quitter la jointure et compter à partir de la deuxième table. Voir la réponse éditée. –

0

Pouvez-vous essayer cela et voir si cela répond à vos besoins?

SELECT poster, title, ISNULL(X.NoOfAnswers,0) 
FROM forum LEFT OUTER JOIN 
(SELECT parentId, COUNT(id) as NoOfAnswers 
FROM forum 
GROUP BY parentId) X 
ON forum.id = X.parentId 
WHERE forum.type = 0 
+0

oui, cela fonctionne aussi. Merci. – jeremy

0
SELECT A.poster, a.acontent, COUNT(B.parentId) AS Answers 
FROM forum B, forum A 
WHERE B.atype = 1 AND B.parentId = A.id 
GROUP BY a.id, a.poster, a.acontent 
Questions connexes