我不知道这是否只能用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
答案 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