热门话题在30天范围内

本文关键字:范围内 30天 热门话题 | 更新日期: 2023-09-27 18:04:12

我在DB表中有超过10k个主题,并且我在会话基础上计算每个主题的页面浏览量,并且仅存储一个视图/每个主题/每个用户(会话时间24小时)。

ID-----Topic----------------Views
1------Love------------------400
2------Friends---------------203
3------Birthday--------------360

现在我想获得最近30天的热门话题,意思是我想获得最近30天内页面浏览量的热门话题。我只是需要一点指导,告诉我怎样才能做到。由于

热门话题在30天范围内

如果您想真正适应最新的视图,则需要将其分离为Topic表和TopicView表。在当前的表结构下,你不知道一个视图是最近的,所以如果你在一年的第10周有一个话题高峰,它可能会在你的热门话题列表中保持很长一段时间(因为"视图"列是累积的)。

CREATE TABLE Topic (
    [Id] INT NOT NULL IDENTITY(1,1)
    [Topic] VARCHAR(255) NOT NULL
)
CREATE TABLE TopicView (
    [ViewId] INT NOT NULL IDENTITY(1,1),
    [TopicId] INT NOT NULL,
    [User] VARCHAR(255) NOT NULL,
    [ViewDate] DATETIME NOT NULL
)

现在你可以检查每次用户点击一个页面,如果你已经为他们登录了一个'TopicView'。当您想要查看热门话题时,可以执行:

DECLARE @maxResults INT = 100  --the maximum number of results we will show
DECLARE @hotTopicViewDays INT = 30 --how recent we want to see hot topic activity
DECLARE @hotTopicViewLimit INT = 300 --what amount of views we consider hot

SELECT TOP (@maxResults)
    T.[Id],
    T.[Topic],
    COUNT(TV.[ViewID]) [Views]
FROM [Topic] T
    JOIN [TopicView] TV
    ON T.[Id] = TV.[TopicId]
WHERE TV.ViewDate >= DATEADD(DAY, -(@hotTopicViewDays), GETDATE())
GROUP BY T.[Id],
    T.[Topic]
HAVING COUNT(TV.[ViewId]) >= @hotTopicViewLimit

这是非常可扩展的,并允许您配置:

  1. 你想用@maxResults返回多少结果
  2. 如何将最近的视图纳入@hotTopicViewDays的"热门话题"活动
  3. 使用@hotTopicViewLimit考虑主题"热门"需要多少活动

如果有任何问题,或者如果有人发现这个方法有问题,请告诉我。

您已经将视图存储在数据库中,这很好。您还需要存储创建主题的日期。

如果你已经这样做了,你可以写一个查询这个(我不知道你的列名等):
SELECT *
FROM Topics t
WHERE t.DateAdded >= dateadd(day, -30, getdate())
ORDER BY t.Views DESC

返回最近30天内创建的所有主题,首先是浏览次数最多的主题。

您不希望将所有10,000条记录加载到内存中,因此请确保实现分页