30天内的热门话题

时间:2015-07-23 16:02:03

标签: c# sql asp.net asp.net-mvc

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

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

现在我想在过去30天内获得热门话题,这意味着我希望在过去30天内根据页面浏览量获得热门话题。我只需要一点方向,就如何实现这一目标。感谢

2 个答案:

答案 0 :(得分:1)

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

如果你已经这样做了,你可以写一个像这样的查询(我不知道你的列名等)。

SELECT *
FROM Topics t
WHERE t.DateAdded >= dateadd(day, -30, getdate())
ORDER BY t.Views DESC

它返回过去30天内创建的所有主题,首先查看最常查看的主题。

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

答案 1 :(得分:1)

如果要真正适应最近的视图,则需要分为Topic表和TopicView表。使用当前的表格结构,不知道视图最近有多少 - 所以如果你在一年中的第10周有一个主题高峰时间,它可能会在你的热门话题列表中保持很长时间(如&#39;视图&#39;列是历史上累积的。)

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
)

现在,如果您已经记录了一个&#39; TopicView&#39;对他们来说如果您想查看哪些主题很热,可以执行:

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. 返回多少结果
  3. 最近的观点需要如何影响&#34;热门话题&#34; @hotTopicViewDays的活动
  4. 考虑主题需要多少活动&#34; hot&#34;使用@hotTopicViewLimit
  5. 如果有任何问题或是否有人发现此方法存在问题,请与我们联系。