我正在开发一个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。 提前感谢您提供的任何帮助。
答案 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)
希望这会有所帮助。如果没有,请解释我错过的内容。