Реализация алгоритма ранжирования Hacker News в SQL - PullRequest
13 голосов
/ 24 сентября 2010

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

News.YC просто

(p - 1) / (t +2) ^ 1.5

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

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

  • Таблица записей с полями postID (индекс) и postTime (метка времени).
  • Таблица Голосования с полями voiceID (индекс), postID и голосование (целое число, 0 или 1).

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

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

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


Похожие вопросы:

Ответы [ 2 ]

21 голосов
/ 24 сентября 2010

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

  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
6 голосов
/ 05 апреля 2013
$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: общее количество пользователей, которым понравились эти новости.

create_at: отметка времени, когда эти новости публикуются

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...