2010-07-15 3 views
3

У меня есть несколько пользователей, представляющих комментарии к нескольким сообщениям в блоге. Пользователи могут комментировать несколько раз в каждом сообщении блога. Мне нужен SQL Query (sql server 2008), чтобы получить последний комментарий для каждого пользователя с помощью BlogPostId.SQL Query, чтобы получить последний комментарий пользователя к сообщению в блоге, ограниченному одним для каждого пользователя?

Допустим, что 3 пользователя представили в общей сложности 10 комментариев к определенному сообщению в блоге. Для Blog Post # 1 Пользователь A отправил 5 комментариев, пользователь B отправил 2 комментария, а пользователь C отправил 3 комментария.

Для конкретного BlogPostId (например, №1), как я могу получить последний комментарий для каждого пользователя, ограничивающего его только их последним комментарием (например, один комментарий для пользователя)?

Конечный результат должен производить три строки

(User A) CommentId, BlogPostId, UserId, CommentData 
(User B) CommentId, BlogPostId, UserId, CommentData 
(User C) CommentId, BlogPostId, UserId, CommentData 
+1

У вас уже есть что-то, что мы могли бы вам помочь, или вы просите нас написать все это для вас? – msarchet

+0

Почему вы не публикуете структуры таблиц? – Kangkan

ответ

1

Есть много много способов сделать это. Использование ранжирования функции:

with cte as (
    select *, row_number() over (partition by UserId order by PostedtDate desc) as rn 
    from Comments 
    where PostId = @postId) 
select * 
from cte 
where rn = 1; 

с использованием агрегатов и крестика применяются:

with cte as (
    select distinct UserId 
    from Comments 
    where PostId = @postId) 
select * 
from cte 
cross apply (
    select top(1) * 
    from Comments c 
    where c.UserId = cte.UserId 
    and c.PostId = @postId 
order by PostedDate desc); 

В конце концов, реальный важный вопрос заключается не в том запрос этой информации (которая является тривиальным, и вы, вероятно, получите 10 ответов за 10 минут), но как вы проектируете свою схему, чтобы быстро выполнить этот запрос.

1

Одним из возможных решений, с немного угадывания к вашей схеме, так как вы не отправляли эту информацию в вашем вопросе (например.):

SELECT 
    C1.comment_id, 
    P.blog_post_id, 
    C1.user_id, 
    C1.comment_data 
FROM 
    Blog_Posts P 
LEFT OUTER JOIN Comments C1 ON 
    C1.blog_post_id = P.blog_post_id 
LEFT OUTER JOIN Comments C2 ON 
    C2.blog_post_id = C1.blog_post_id AND 
    C2.user_id = C1.user_id AND 
    C2.comment_date > C1.comment_date 
WHERE 
    P.blog_post_id = @blog_post_id AND 
    C2.comment_id IS NULL 

Если C2.comment_id имеет значение null, то это должно быть потому, что более поздний комментарий не может быть объединен, поэтому C1 должен быть последним. Если есть точная связь за время, вы можете получить два комментария для одного и того же пользователя.

-1

выберите Top (1) CommentID, комментарий, UserName, CreateDate от комментариев, где BlogPostID = 1 Сортировать по CreateDate, UserName, комментарий, CommentID группы по нику

OK это просто прямо из моей головы, не зная, ваша база данных Вам нужно получить все комментарии для своего блога , тогда вам нужно отсортировать по дате создания комментария как asc или desc , тогда вам нужно сгруппировать его для пользователя и выбрать первый из списка ... в зависимости от того, как вы сортируете, вы также можете выбрать последнее, тоже ...

НТН

0

Вы можете попробовать это:

select * from comments where blogpost_id = 3333 and comment_id in 
(select max(comment_id) from comments where blogpost_id = 3333 group by UserId) 
3

Поскольку это MS SQL 2008, то почему бы не использовать ROW_NUMBER()

WITH last_comment AS 
(
    SELECT ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY DateAdded) as RowIndex, 
      * 
    FROM BlogPost B 
    WHERE BlogPostId = @BlogPostId 
) 
SELECT * 
FROM last_comment 
WHERE RowIndex = 1 
+0

Это тоже работает! –