单个SQL查询,返回相对于过去7天的"评论最多"的列表,但列表始终必须包含某些内容

soh*_*970 1 mysql sql aggregate

首先看起来容易的东西现在变成了一个脑筋急转弯.

我正在构建您在新闻/博客网站右侧边栏中看到的"评论最多"或"最通过电子邮件"列表中的一个.

该列表必须与最近的日期范围(比如最近7天)相关,因为您希望列表始终保持新鲜并包含较新的内容.否则,收到大量评论的少数文章将始终位于列表顶部.

例如,在我的情况下,该网站有一些文章,每篇文章有几百个评论,但其余的都少于20.所以如果"最多评论"列表被拉出这样:

select
  ArticleId,
  count(CommentId) as Comments
from
  Comment
group by
  ArticleId
order by
  count(CommentId) desc
limit 10;
Run Code Online (Sandbox Code Playgroud)

然后,几篇有几百条评论的文章总是排在最前面.该列表永远不会改变.

所以我重新编写了select,包括过去7天:

select
  ArticleId,
  count(CommentId) as Comments
from
  Comment
where
  Created >= '2011-06-14'
group by
  ArticleId
order by
  count(CommentId) desc
limit 10;
Run Code Online (Sandbox Code Playgroud)

这看起来更好,但它仍然无法工作,因为它没有考虑过去7天内没有活动的情况.

如果在过去7天内没有发生任何事情(或只发生了一些评论),则该列表应包含此前的活动.底线 - 列表总是需要显示10篇文章.

我总是可以调用多个SQL语句,以7天的增量返回,直到我填写列表,但我不想这样做.我正在缓存进程内存中的结果,但我仍然希望尽可能只进行一次SQL调用.

思考?我觉得这很容易实现,我只是忽略了一个明显的地方.

Ste*_*ice 5

我建议为每个结果计算一个权重并按此排序.例如,您的体重可以是行动(评论,电子邮件等)/年龄(以天为单位).这样,物品越老,其重量越低,除非它具有极高的动作率.

就像是:

select
  ArticleId,
  count(CommentId) / (1.0 * DATEDIFF(CURRENT_DATE, Created)) AS weight
from
  Comment
group by
  ArticleId
order by
  weight desc
limit 10;
Run Code Online (Sandbox Code Playgroud)

你需要使用你的体重公式,直到你得到正确的新内容与较旧但活跃的内容组合.