SQL帮助,分层表数据

时间:2011-11-14 20:12:45

标签: sql-server

我正在开发一个facebook类型的应用程序,我正在尝试开发一个好的查询来获取最新的消息。消息可以是新线程(parentID空guid)或回复。我需要的是一个查询来获取前10个,或10-20个或20-30个最新的线程或者有最后的回复,我希望你能得到这个想法

这是表格

CREATE TABLE [dbo].[Messages](
[Id] [uniqueidentifier] NOT NULL,
[ParentId] [uniqueidentifier] NOT NULL,
[message] [nvarchar](max) NOT NULL,
[MessageDateTime] [datetime] NOT NULL
)

我有一个有效的查询,因为它可以得到前10个,20个3个结果等。

SELECT ym.* FROM
(
  SELECT top 20 TopId, MAX(MessageDateTime) as Mess FROM
  (

        SELECT
        CASE ParentId WHEN '00000000-0000-0000-0000-000000000000' THEN Id ELSE ParentId END AS TopId, MessageDateTime
        FROM Messages

  ) As Temp
  GROUP BY TopId order by Mess desc)
  AS table2
  INNER JOIN Messages ym
  ON ym.id = TopId

主要问题是可能没有回复,因此案例是statemnt。 提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

正如我上面所说,如果在没有父级的情况下允许ParentId为NULL,将会有所帮助。然后你可以使用合并而不是案例。

这与上面的内容很接近。如上所述,它只会返回顶级消息(父节点或没有子节点的消息),因为此查询也基于Id。

SELECT *
FROM Messages
WHERE Id IN
(SELECT TOP 20
 CASE ParentId WHEN '00000000-0000-0000-0000-000000000000' THEN Id ELSE ParentId END AS TopId
 FROM Messages ORDER BY MessageDateTime DESC)

如果你允许使用NULLS,可以像这样清理它:

SELECT *
FROM Messages
WHERE Id IN
(SELECT TOP 20
 coalesce(ParentId, Id) AS TopId
 FROM Messages ORDER BY MessageDateTime DESC)

然后调整查询以包含原始邮件和回复:

将是微不足道的
SELECT *
FROM Messages
WHERE coalesce(ParentId, Id) IN
(SELECT TOP 20
 coalesce(ParentId, Id) AS TopId
 FROM Messages ORDER BY MessageDateTime DESC)

希望这会有所帮助。如果没有,请解释我错过的内容。