论坛热门话题sql按日期排序然后回复

时间:2020-03-28 14:45:54

标签: sql sql-server tsql join group-by

我不知道这是否只能用SQL完成。我目前拥有适用于所有论坛的最新主题的SQL。我需要一个热点话题。

从今天开始,该顺序将是20个主题,其中答复最多的是按顶部排列的大多数答复。然后,对于昨天和前一天,等等,以此类推,直到检索到最多2000个主题为止。我不知道如何或是否可以做到

顺便说一句,这是用于SQL Server。

今天

replies 100
replies 80
replies 70
etc

昨天

replies 100
replies 80
replies 70
etc

以此类推,最多包含2000个主题

这是当前最新的SQL主题:

存储过程定义:

 CREATE PROCEDURE [dbo].[SPTopicsGetHot]
     @UserGroupId int = NULL
 AS
     /*
     Gets the latest messages in all forums  
     */
     SELECT TOP 200
         T.TopicId
         ,T.TopicTitle
         ,T.TopicShortName
         ,T.TopicDescription
         ,T.TopicCreationDate
         ,T.TopicViews
         ,T.TopicReplies
         ,T.UserId
         ,T.TopicIsClose
         ,T.TopicOrder
         ,T.LastMessageId
         ,T.UserName
         ,T.ForumId
         ,M.MessageCreationDate
         ,M.UserId AS MessageUserId
         ,MU.UserName AS MessageUserName
         ,F.ForumName
         ,F.ForumShortName
     FROM
         TopicsComplete T
     LEFT JOIN 
         Messages M ON M.TopicId = T.TopicId 
                    AND M.MessageId = T.LastMessageId AND M.Active = 1    
     LEFT JOIN 
         Users MU ON MU.UserId = M.UserId
     LEFT JOIN 
         Forums F ON F.ForumId = T.ForumId
     WHERE
         ISNULL(T.ReadAccessGroupId,-1) <= ISNULL(@UserGroupId,-1)
     ORDER BY 
         T.TopicId DESC

1 个答案:

答案 0 :(得分:1)

如果我正确地遵循了您的要求,那么您希望每天有20条主题,它们的消息最多(总共0200行)。

您的查询有很多列,因此这里是它的简化版本;通过将topic与一个聚合查询结合起来,该查询会计算相关message的数量,然后进行排名和过滤。

select top(2000) *
from (
    select 
        t.*, 
        m.cnt,
        row_number() over(partition by cast(topiccreationdate as date) order by m.cnt desc) rn
    from topicscomplete t
    inner join (select topicid, count(*) cnt from messages where m.active = 1 group by topicid) m
        on m.topicid = t.topicid
    where isnull(t.readaccessgroupid,-1) <= isnull(@usergroupid,-1)
) t
where rn <= 20
order by cast(topiccreationdate as date) desc, rn