Операция T-SQL Group - PullRequest
       12

Операция T-SQL Group

0 голосов
/ 30 декабря 2010

У меня есть две таблицы, как показано ниже:

**tblComments**
Commentid
addeddate
Postid


**tblPosts**
Postid
AddedBy
AddedDate
Title

Я хочу найти общее количество комментариев для каждого поста. Как это сделать?

Ответы [ 5 ]

3 голосов
/ 30 декабря 2010

Вам нужно присоединиться к таблицам, чтобы найти посты без комментариев, чтобы получить ноль

select
    count(c.postid), P.postid --edit
from
    tblPosts P 
    LEFT JOIN
    tblComments C On P.postid  = C.postid 
group by
    P.postid 
1 голос
/ 30 декабря 2010

Чтобы получить ноль для поста без комментариев, T-SQL:

select
    P.postid, count(c.postid) -- should not use COUNT(*) for LEFT JOINs
from
    tblPosts P 
    LEFT JOIN
    tblComments C On P.postid  = C.postid 
group by
    P.postid 

Для Postgresql получите количество строк:

select
    P.postid, count(c.*) -- should not use COUNT(*) for LEFT JOINs
from
    tblPosts P 
    LEFT JOIN
    tblComments C On P.postid  = C.postid 
group by
    P.postid 

С этим связано: http://www.ienablemuch.com/2010/04/debunking-myth-that-countdracula-is.html

Вот почему COUNT (*) не должен использоваться в левом соединении:

create table posts
(
post_id int identity(1,1) not null primary key,
post varchar(max)
);

create table comments
(
post_id int not null references posts(post_id),
comment_id int identity(1,1) not null primary key,
comment varchar(max)
);

insert into posts(post) values('hello');

insert into posts(post) values('oh hai');
insert into comments(post_id,comment) values(SCOPE_IDENTITY(), 1);

-- don't
select p.post_id, COUNT(*) as comment_count from
posts p
left join comments c on c.post_id = p.post_id
group by p.post_id

-- do
select p.post_id, COUNT(c.post_id) as comment_count from
posts p
left join comments c on c.post_id = p.post_id
group by p.post_id

Выход:

post_id     comment_count
----------- -------------
1           1
2           1


post_id     comment_count
----------- -------------
1           0
2           1

Стиль запросов более привлекателен для Postgresql, если подумать, на самом деле мы рассчитываем количество элементов множества, а не столбцов:

-- looks better on Postgresql, COUNT(c.*)
select p.post_id, COUNT(c.*) as comment_count from
posts p
left join comments c on c.post_id = p.post_id
group by p.post_id
0 голосов
/ 30 декабря 2010
select case(when count(commentid)>0 then count(commentid) else 0 end), postid from tblPosts group by postid 
0 голосов
/ 30 декабря 2010

РЕДАКТИРОВАТЬ: Отредактировано на основе вашего комментария ниже, чтобы получить все сообщения, в том числе с 0 комментариями.Попробуйте это.Я думаю, что это должно работать так, как вы ожидаете

SELECT p.Postid, p.Title, ISNULL(X.count,0)
FROM tblPosts p
LEFT OUTER JOIN 
   (SELECT postid, count(commentid) as Total
   FROM tblComments
   GROUP BY Postid) AS X
ON p.Postid = X.Postid
0 голосов
/ 30 декабря 2010
select count(*), postid from tblPosts group by postid 

должен сделать трюк, который я думал бы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...