Intereting Posts
Hibernate выполнить обновление с помощью критериев SQL запятая разделил столбец => на строки, а затем суммарные суммы? Предложение MySQL WITH WITH SSIS импортирует плоский файл в SQL с первой строкой в ​​виде заголовка и последней строки в качестве общего Как правильно создать схему базы данных для этого сценария Является ли массовое обновление быстрее, чем одно обновление в db2? Групповая строка по сумме определенной колонки, равной удельной стоимости Колонка с альтернативными сериалами Предоставить разрешение SELECT для представления, но не для базовых объектов Создание графика зависимости таблицы с рекурсивным запросом Функция plpgsql, которая возвращает несколько столбцов, вызывается несколько раз Как разделить содержимое ячейки и извлечь информацию в новый столбец в инструкции выбора SQL? Неверное обслуживание в Apache Tomcat WebService Вставка базы данных C # (ASP.NET) – ExecuteNonQuery: свойство CommandText не инициализировано Подключение различных пользователей Windows в SQL Server Management Studio (2005 или более поздней версии)

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