2010-12-14 30 views
0

J'ai une table qui stocke les messages. Chaque post-objet a un postTypeId qui indique s'il s'agit d'un post de question ou d'un post de réponse. Je voudrais recevoir des questions et compter le nombre de réponses à chaque question. Puis-je le faire en utilisant un JOIN au lieu d'une sous-requête comme indiqué ci-dessous? Le schéma suppose: postsTable(id, postTypeId, parentId, title)Puis-je utiliser JOIN au lieu d'une sous-requête pour obtenir COUNT() à travers les tables dans MySQL?

SELECT 
    posts.id, posts.postTypeId, posts.parentId, posts.title 
    , (SELECT COUNT(answers.id) AS answerCount FROM posts AS answers WHERE posts.id = answers.parentId GROUP BY posts.postTypeId) 
    FROM posts 
    WHERE posts.postTypeId = '1' 

également, est le groupe nécessaire par la sous-requête?

Répondre

1
SELECT 
     p.id, count(answers.id) answerCount, p.title 
FROM posts p 
    LEFT JOIN posts answers 
    ON posts.id = answers.parentId 
WHERE 
    p.postTypeId = '1' 
GROUP BY 

p.id, p.title 

Jetez un oeil à this query voir pour SO

Les principaux avantages à ce que son généralement plus rapide et plus facile à lire, mais il vous permet également d'obtenir plus de données de « réponses ».

E.g.

SELECT 
     p.id, count(answers.id) answerCount, p.title, MAX(Answers.Score) HighScore, 
FROM posts p 
    LEFT JOIN posts answers 
    ON posts.id = answers.parentId 
WHERE 
    p.postTypeId = '1' 
GROUP BY 

p.id, p.title 
+0

Merci Conrad, c'est génial! Y a-t-il des avantages/désavantages relatifs à chaque approche? – Mohamad

+0

Conrad, encore une fois, c'est fantastique. Une dernière chose: Supposons que vous vouliez rejoindre les votes sur cette requête, vous ajouteriez une jointure supplémentaire en tant que telle: left join votes sur p.id = votes.postid; J'ai juste essayé, mais les sommes sont toutes incorrectes! Il semble que le nombre de «votes» compte les votes pour le poste parent et celui pour les enfants ... est-ce logique? – Mohamad

+0

Ce que je voulais dire, c'est que l'ajout d'un COUNT supplémentaire (votes.id) chamboule le compte original. Je pense que la requête compte votes.id pour chaque itération de count (answers.id) ... J'espère que cela a du sens! – Mohamad

1
SELECT posts.id, posts.postTypeId, posts.parentId, posts.title, COUNT(answers.id) AS answerCount 
    FROM posts 
    LEFT JOIN posts ON posts.id = answers.parentId 
    WHERE posts.postTypeId = '1' 
    GROUP BY posts.id 
1

Comment cela?

SELECT questions.id, questions.posttypeID, questions.parentID, questions.title, count(questions.id) AS NUM_OF_ANSWERS 
FROM posts AS questions 
LEFT JOIN posts AS answers on (answers.parentID = questions.id) 
WHERE questions.postTypeID = '1'; 
ORDER BY questions.id, questions.posttypeID, questions.parentID, questions.title; 
+0

On dirait que Conrad m'a battu pour ça. Assurez-vous d'inclure toutes les colonnes que vous listez dans la clause SELECT dans la clause order by, à l'exclusion de count() – suhprano

+0

Merci suhprano! Il y a une chose supplémentaire que je ne peux pas sembler sortir. Disons que je voulais rejoindre les votes et obtenir un vote compte sur la question ... cela semble gâcher la réponse compte, et je ne sais pas pourquoi ... Je suis simplement en train de dupliquer la jointure pour les réponses! – Mohamad

+0

Donc, il y a une question, avec des réponses associées, avec des votes associés à la question? – suhprano