Внедрение алгоритма ранжирования новостей 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, который, когда опубликованные новости