2010-09-24 10 views
11

Así es como Paul Graham describes the ranking algorithm for Hacker News:Implementación del Hacker News algoritmo de clasificación en SQL

News.YC está justo

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

donde p = puntos y T = edad en horas

que me gustaría hacer eso en mySQL pura da las siguientes tablas:

  • Publicaciones de tabla con los campos postID (índice) y postTime (marca de tiempo).
  • Table Votos con los campos voteID (index), postID, y vote (integer, 0 o 1).

La idea del campo de votación es que los votos pueden rescindirse. A los efectos del ranking, vote = 0 es equivalente a no votar en absoluto. (Todos los votos son votos hacia arriba, no hay votos hacia abajo)

La pregunta es cómo crear una consulta que devuelva los N primeros ID de correo, ordenados por la fórmula de Paul Graham. Hay aproximadamente 100k publicaciones en total, así que si crees que será necesario almacenar en caché los puntajes o cualquier cosa, me gustaría escuchar consejos sobre eso.

(Obviamente, esto no es ciencia de cohetes y ciertamente puedo averiguarlo, pero pensé que alguien que come SQL para el desayuno, el almuerzo y la cena podría simplemente contarlo. Y parece valioso tener disponible en StackOverflow.)


preguntas relacionadas:

Respuesta

19

No comprobado:

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 
+0

Acabo de implementar esto en un proyecto y parece funcionar muy bien hasta ahora. Hará más pruebas e informará. – Banago

6
$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"); 

Este código funciona para mí hacer una página de inicio como HN.

noticia: es el nombre de la tabla.

noOfMe gusta: número total de usuarios como esta noticia.

created_at: TimeStamp que cuando esa noticia publicó

Cuestiones relacionadas