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调用.
思考?我觉得这很容易实现,我只是忽略了一个明显的地方.
我建议为每个结果计算一个权重并按此排序.例如,您的体重可以是行动(评论,电子邮件等)/年龄(以天为单位).这样,物品越老,其重量越低,除非它具有极高的动作率.
就像是:
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)
你需要使用你的体重公式,直到你得到正确的新内容与较旧但活跃的内容组合.
| 归档时间: |
|
| 查看次数: |
503 次 |
| 最近记录: |