2009-06-10 2 views
4

У меня есть две таблицы, например:SQL запрос, чтобы получить строку, и количество сопутствующих строк

#Articles: 
ID | Title 
1 "Article title" 
2 "2nd article title" 

#Comments: 
ID | ParentID | Comment 
1 1   "This is my comment" 
2 1   "This is my other comment" 

Я всегда хотел знать, что это самый элегантный способ, чтобы получить следующий результат :

ID | Title |   NumComments 
1 "Article title"  2 
2 "2nd article title" 0 

Это для SQL Server.

ответ

17

Это, как правило, быстрее, чем подзапрос подход, но, как всегда, вы должны профиль вашей системы, чтобы быть уверенным:

SELECT a.ID, a.Title, COUNT(c.ID) AS NumComments 
FROM Articles a 
LEFT JOIN Comments c ON c.ParentID = a.ID 
GROUP BY a.ID, a.Title 
+1

+1 ... Моя мысль тоже; ты слишком быстро, Джоэл. – Adrien

+1

Данг это ты меня избил ... + 1 – CodeLikeBeaker

+1

Ну, сначала с правильным ответом получаешь очки! Спасибо, Джоэл! –

1
select title, NumComments = (select count(*) 
from comments where parentID = id) from Articles 
+0

+1, вы штопать быстро по ответу –

1
SELECT 
    A.ID, A.Title, COUNT(C.ID) 
FROM 
    Articles AS A 
LEFT JOIN 
    Comments AS C ON C.ParentID = A.ID 
GROUP BY 
    A.ID, A.Title 
ORDER BY 
    A.ID 
+0

Боюсь, вы не получите статьи без комментариев ... – tekBlues

+0

Я знаю. Старался обновляться и переписывался. Исправлено. –

0

Я хотел бы сделать это следующим образом:

select a.ID 'ArticleId', 
     a.Title, 
     count(c.ID) 'NumComments' 
from Articles a 
left join 
     Comments c 
on  a.ID = c.ParentID 
group by a.ID, a.Title 

Это может помочь решить вопрос о присоединении или использовании подзаголовка:

Transact-SQL - sub query or left-join?

+0

Небольшая проблема с этим. A.ID = C.ID означает, что вы свяжете только один уникальный комментарий с одной уникальной статьей. Возможно, вы имели в виду A.ParentID = C.ID –

+0

@Matthew - D'oh! Хороший момент, исправлено :) – Nick

0
SELECT 
Articles.ID 
,Articles.TItle 
,(SELECT Count(*) FROM Comments WHERE Comments.ParentId = Artices.ID) AS CommentCount 
FROM Articles 
0

ВЫБРАТЬ Articles.Title, COUNT (Comments.ID) FROM Статьи INNER JOIN Комментарии о Articles.ID = Comments.ParentID GROUP BY Articles.Title

Смежные вопросы