Внедрение алгоритма ранжирования новостей Hacker в SQL
Вот как Пол Грэм описывает алгоритм ранжирования для Hacker News:
News.YC просто
(p - 1)/(t + 2) ^ 1,5
где p = точки и t = возраст в часах
Я хотел бы сделать это в чистом mySQL, учитывая следующие таблицы:
- Столбцы с полями postID (индекс) и postTime (временная метка).
- Таблица голосов с полями voteID (index), postID и vote (integer, 0 или 1).
Идея поля для голосования заключается в том, что голоса могут быть отменены.
Для целей рейтинга голос = 0 эквивалентен отсутствию голоса.
(Все голоса - это upvotes, не такие вещи, как downvotes.)
Вопрос заключается в том, как построить запрос, который возвращает верхние N идентификаторов postID, отсортированные по формуле Пола Грэма.
Всего около 100 тыс. Сообщений, поэтому, если вы думаете, что кеширование баллов или что-то понадобится, я бы с удовольствием услышал об этом.
(Очевидно, что это не ракетостроение, и я, конечно, могу это понять, но я подумал, что кто-то, кто ест SQL на завтрак, обед и ужин, может просто сбить его с ног. И, похоже, это полезно для StackOverflow.)
Похожие вопросы:
Ответы
Ответ 1
Непроверенные:
SELECT x.*
FROM POSTS x
JOIN (SELECT p.postid,
SUM(v.vote) AS points
FROM POSTS p
JOIN VOTES v ON v.postid = p.postid
GROUP BY p.postid) y ON y.postid = x.postid
ORDER BY (y.points - 1)/POW(((UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(x.timestamp))/3600)+2, 1.5) DESC
LIMIT n
Ответ 2
$sql=mysql_query("SELECT * FROM news
ORDER BY ((noOfLike-1)/POW(((UNIX_TIMESTAMP(NOW()) -
UNIX_TIMESTAMP(created_at))/3600)+2,1.5)) DESC
LIMIT 20");
Этот код работает для меня, чтобы сделать домашнюю страницу, такую как HN.
news: это имя таблицы.
noOfLike: Общее количество пользователей, таких как новости.
created_at: TimeStamp, который, когда опубликованные новости