13

PaulGrahamがHackerNewsのランキングアルゴリズムを説明する方法は次のとおりです。

News.YCはただ

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

ここで、p =ポイント、t=時間単位の年齢

次の表を前提として、純粋なmySQLでこれを実行したいと思います。

  • フィールドpostID(インデックス)およびpostTime(タイムスタンプ)を持つテーブル投稿。
  • テーブルvoteid(インデックス)、postID、およびvote(整数、0または1)のフィールドを持つ投票。

投票フィールドの考え方は、投票を取り消すことができるということです。ランキングの目的では、vote=0は投票がまったくないことと同じです。(すべての投票は賛成票であり、反対票などはありません。)

問題は、PaulGrahamの式でソートされた上位N個のpostIDを返すクエリを作成する方法です。全部で約10万件の投稿があるので、スコアのキャッシュなどが必要になると思われる場合は、そのアドバイスをお聞かせください。

(明らかにこれはロケット科学ではなく、確かに理解できますが、朝食、昼食、夕食にSQLを食べる人は、それをガタガタ鳴らすことができると思いました。StackOverflowで利用できることは価値があるようです。)


関連する質問:

4

2 に答える 2

21

未テスト:

  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
于 2010-09-24T03:09:42.117 に答える
7
$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のようなホームページを作成するのに役立ちます。

ニュース:はテーブル名です。

noOfLike:このニュースのようなユーザーの総数。

created_at:そのニュースが投稿されたときのタイムスタンプ

于 2013-04-05T12:49:46.507 に答える