Mysql查询对数老化

use*_*178 8 mysql

我想实现一个基于老化的"对数"分数衰减,我试图找出SUM/LOG组合.这里有一个当前查询的简化版本:

SELECT SUM(1) as total_score FROM posts
JOIN votes ON votes.post_id = posts.post_id
WHERE 1
GROUP BY post_id
ORDER BY total_score DESC
Run Code Online (Sandbox Code Playgroud)

我目前正在使用SELECT'SUM(1)作为total_score',但我想修改查询以考虑投票的日期/年龄; 今天投票从今天权重1,投票从15天前的权重接近.8和投票从30天前接近0.我将日期字段存储在投票表(vote_date)上作为unix_timestamp.

在此输入图像描述

我并不真正关心WHERE clausule; 这很简单.我想弄清楚的是对数老化部分.

O. *_*nes 0

假设您有一个函数WEIGHT(age)可以给出几天前投票的权重age

那么你的查询将是

    SELECT SUM(WEIGHT(DATEDIFF(CURRENT_DATE, votes.date_vote_cast))) as total_score,
           posts.post_id
      FROM posts
      JOIN votes ON votes.post_id = posts.post_id
     WHERE votes.date_vote_cast <= CURRENT_DATE
       AND votes.date_vote_cast > CURRENT_DATE - INTERVAL 30 DAY
  GROUP BY post_id
  ORDER BY total_score DESC 
Run Code Online (Sandbox Code Playgroud)

恐怕我不知道你到底想要什么功能WEIGHT(age)。但你确实这么做了,而且你可以解决这个问题。