如何编写查询(sql server)来加载评论&回复像facebook?

时间:2011-07-07 04:32:16

标签: sql sql-server

我有评论表:(用于评论和回复)

-commentId
-parentId
-message

parentId=0: comment
parentId != 0: reply

像facebook一样,我想查询(sql server)获取评论和回复。但回复后,我只想获得3个最新回复。在网站上,我将显示“显示所有回复”以通过ajax调用获取。

那么,我该如何编写此查询:例如:http://i.stack.imgur.com/mASRC.png

有任何帮助吗?请!

3 个答案:

答案 0 :(得分:1)

对于任何层次结构,您需要递归查询。因为如果您不限制回复数量,则不知道您的表中存储了多少级别的回复。你的表就像这些表:

    CategoryId & CategoryTitle & ParentCategoryId

    EmployeeId & EmployeeName & ManagerId

但是在这些表中都没有,您不知道表中存在多少级别。 所以,你必须写一个递归查询。

答案 1 :(得分:1)

https://web.archive.org/web/20080206204801/http://sqlserver2000.databases.aspfaq.com:80/how-do-i-limit-the-number-of-rows-returned-in-my-resultset.html

本文看起来可能有助于约束结果集中的行数。

你有没有试过像:

SELECT TOP 3 commentID, parentId, message
FROM commentTable
WHERE parentId IN(0,1)
ORDER BY message DESC;

如果您有权控制数据库的布局,您可能希望将表分成两个关于各个主题的表:一个用于消息,一个用于回复。然后,您可以在回复表中添加日期时间字段,并根据过帐日期从订单desc中选择其中的前3行。

答案 2 :(得分:1)

declare @Comment table(commentId int, parentId int, message varchar(20))

insert into @Comment 
select 1, 0,'my comment 1' union all
select 2, 0,'mu comment 2' union all
select 3, 1,'reply 1.1'    union all
select 4, 1,'reply 1.2'    union all
select 5, 1,'reply 1.3'    union all
select 6, 1,'reply 1.4'    union all
select 7, 1,'reply 1.5'    union all
select 8, 2,'reply 2.1'    union all
select 9, 2,'reply 2.2'    union all
select 10,2,'reply 2.3'    union all
select 11,2,'reply 2.4'

;with C as
(
  select commentId,
         parentId,
         message,
         row_number() over(partition by parentId order by commentId desc) as rn
  from @Comment
)
select C.commentId,
       C.parentId,
       C.message
from C
where C.parentId = 0 or C.rn <= 3
order by C.commentId

结果:

commentId   parentId    message
----------- ----------- --------------------
1           0           my comment 1
2           0           mu comment 2
5           1           reply 1.3
6           1           reply 1.4
7           1           reply 1.5
9           2           reply 2.2
10          2           reply 2.3
11          2           reply 2.4