2017-04-11 6 views
2

システム上のエントリのredditスタイルスコア低下システムを作成しようとしています。私は合計 "スコア"(すべてのアップ/ダウン投票の合計)を計算するMySQLのビューのセットアップを持っています。私は、新しいエントリが一番上に終わるように、エントリをページの下に移動するシンプルで、しかし効果的なシステムを作るのには問題がありますが、そうでなければ古くなっていたトップにエントリを移動できます。Reddit Style Score Degridation With MySQL

は、ここでSQLの最も近いビットは、私がこれまでに作成することができましたです:

(SUM(v.Score) - (TIMESTAMPDIFF(MINUTE, t.Genesis, NOW()) * 
       IF(TIMESTAMPDIFF(MINUTE, t.Genesis, NOW()) > 1440, 
        0.1, 0.003)) 
) as "Weight", 

v.Scoreが1または-1のユーザ票に依存しています。 t.Genesisはエントリ自体のタイムスタンプです。

ご意見やご提案があれば幸いです。あなたがハッカーのニュースよりも、同じランクのアルゴリズムを実装することができます

+0

すべてのアップ/ダウン票を合計するよりも良い選択肢があります。あなたはここで見ることができます:http://www.evanmiller.org/how-not-to-sort-by-average-rating.html そして、あなたは時間varを追加することができます、データが古い場合は、スコアリング –

+0

サンプルデータと期待される結果plsを投稿してください... – etsa

+0

@ J-CFOREST - それは有望そうに見えますが...私は実際にそれに時間変数を実装する方法がわかりません。思考? –

答えて

0

Implementing the Hacker News ranking algorithm in SQL

@OMGポニーソリューション:

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 

x.timestampはあなたのt.Genesisあり、v.voteはあなたですv.Score

+0

これは、新しい投稿がトップの近くにランク付けされておらず、等しい点を持つ投稿が最も古い順番に並べられているように見えるという小さな欠点がありますか?本質的にORDER BYポイント、起源 –

1

解決策の1つは、ランク付けパラメータとして時間の関連性のために一種の指数関数的減衰を使用することです。私はSQLでその偉大ないですけど、ここでの試みです:公開

SELECT article,ranking FROM (SELECT article, upvotes+downvotes AS Total, upvotes-downvotes AS Score, EXP(-(Published-Genesis)*constant/86400)*Score/Total AS Ranking FROM Table ) ORDER BY ranking DESC

は、出版の時点で、ジェネシスは、いくつかの本当に早い日付で、定数が決定するために、スケーリング係数がどのように後半重​​量でゼロに低下する必要があります

(例えばのために、あなたは今から7日後にすべての記事に非常に小さなスコアの利点 を与えたい場合は、0.1を言う、そして-ln(0.1)/ 7は、あなたの定数です。

スコア/絶対値ではなく平均格付けの合計、1秒あたりの86400(秒単位で測定されたと仮定)。もう一度、SQL関数の知識が不足していることについてお詫び申し上げます。私はEXPが間違いなく可能であることを知っています。時間差を調整して時間差を秒単位で得ることができます。