【问题标题】:forum hot topics sql sort by date then replies论坛热门话题sql按日期排序然后回复
【发布时间】:2020-03-28 14:45:54
【问题描述】:

我不知道这是否可以仅使用 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

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。
  • 帮助我们帮助您 - 请分享表格结构

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


【解决方案1】:

如果我正确地关注了你,你想要每天有最多消息的 20 个主题(总共 0200 行)。

您的查询有很多列,所以这里是它的简化版本;这是通过将topics 与一个聚合查询连接起来的,该查询计算相关messages 的数量,然后进行排名和过滤。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多