Внедрение алгоритма ранжирования новостей Hacker в SQL

Вот как Paul Graham описывает алгоритм ранжирования для Hacker News :

News.YC – это просто

(p – 1) / (t + 2) ^ 1,5

где p = точки и t = возраст в часах

Я хотел бы сделать это в чистом mySQL, учитывая следующие таблицы:

  • Столбцы с полями postID (индекс) и postTime (временная метка).
  • Таблица голосов с полях voteID (индекс), postID и голосование (целое число, 0 или 1).

Идея поля голосования заключается в том, что голоса могут быть отменены. Для целей рейтинга голос = 0 эквивалентен отсутствию голоса. (Все голоса – это авансы, не такие вещи, как downvotes.)

Вопрос заключается в том, как построить запрос, который возвращает верхние N идентификаторов postID, отсортированные по формуле Пола Грэма. Всего около 100 тыс. Сообщений, поэтому, если вы думаете, что кеширование баллов или что-то понадобится, я бы с удовольствием услышал об этом.

(Очевидно, это не ракетостроение, и я, конечно, могу это понять, но я подумал, что кто-то, кто ест SQL на завтрак, обед и ужин, может просто сорвать его. И, похоже, это доступно для StackOverflow.)


Связанные вопросы:

  • Алгоритм упорядочения стиля Hacker News в Linq-To-SQL
  • Как сортировать как хакерские новости
  • https://meta.stackexchange.com/questions/11602/what-formula-should-be-used-to-determine-hot

Непроверенные:

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 
 $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, что когда эта новость отправлена