0

这可能已经被问过 1000 次,但我找不到。

我有以下数据库设计:

Table Comment
ID     UserID     CommentText    DateTime          ReplyTo
1      19823      Nice site!     2013-07-08 11:14  NULL
2      232912     Sure this is   2013-07-08 11:15  1
3      84291      Can we get     2013-07-08 11:16  NULL
4      300192     I listened to  2013-07-08 11:17  1

我想像这样嵌套在评论和回复中显示它:

ID
3
1
  2
  4

所以我想要实现的是通过 DateTime DESC 对所有没有回复的评论进行排序,然后对于每个评论以日期时间升序显示回复。

这可能在一个 SQL 查询中实现吗?

我试过这个,但它出乎意料地错了

SELECT ID, UserID, CommentText, DateTime 
FROM Comment
LEFT JOIN Comment AS reply ON Comment.ID = Reply.ReplyTo
GROUP BY ID, UserID, CommentText, DateTime
HAVING ReplyTo IS NULL
ORDER BY DateTime Desc

我应该把它分成两个查询并做一个UNION吗?或者我应该改变数据库的设计?

4

2 回答 2

2

您可以使用递归 CTE(公用表表达式) - 一种允许您通过层次结构下降的技术。

http://msdn.microsoft.com/EN-US/library/ms175972(v=VS.110,d=hv.2).aspx

...文章末尾的几个例子

于 2013-07-08T22:14:21.527 回答
0

您应该能够利用 row_number(),特别是 order by 子句并执行以下操作:

select ReplyID, DateTime, replyto,
    row_number() over(order by DateTimedesc) AS OrderID
from reply
where replyto is null
union
select ReplyID, DateTime, replyto,
    row_number() over(order by DateTimeasc) AS OrderID
from reply
where replyto is not null
于 2013-07-08T22:11:07.273 回答