我想制作另一个列有“What's Hot”的列表,例如reddit。
我found this topic,它解释了排序算法的工作原理
首先我想问一下,使用他们的算法是否合法?
如果是,我将如何将其应用于PHP数据库查询。 我是否需要首先选择所有帖子然后对其进行排序?
function hot($ups, $downs, $date) {
$s = $ups - $downs;
$order = log(max(abs(s), 1), 10);
if(s > 0) {
$sign = 1;
} elseif(s < 0) {
$sign = -1;
} else {
$sign = 0;
}
$date = new DateTime($date);
$seconds = $date->format('U');
return round($order + $sign * $seconds / 45000, 7);
}
这是我将其转换为PHP时的结果。
答案 0 :(得分:1)
假设你的起伏列被称为ups
和downs
,那么就像:
ORDER BY ROUND(
( LOG10(
GREATEST(
ABS(`ups` - `downs`),
1
)
) +
SIGN(`ups` - `downs`) *
UNIX_TIMESTAMP(`date_posted`) / 45000
),
7
)
最好使用此公式在选择列表中创建计算列,然后按该列排序
修改强>
计算列的示例:
SELECT `ups`,
`downs`,
`posted_date`,
ROUND(
( LOG10(
GREATEST(
ABS(`ups` - `downs`),
1
)
) +
SIGN(`ups` - `downs`) *
UNIX_TIMESTAMP(`date_posted`) / 45000
),
7
) AS hotness
FROM `posts`
因此hotness
是您计算的列