2010-09-24 40 views
11

Sau đây là cách Paul Graham describes the ranking algorithm for Hacker News:Thực hiện thuật toán xếp hạng Hacker Tin tức trong SQL

News.YC là chỉ

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

trong đó p = điểm và t = tuổi trong giờ

tôi muốn làm điều đó trong mySQL tinh khiết cho các bảng sau:

01.235.
  • Bảng bài đăng có trường postID (chỉ mục) và postTime (dấu thời gian).
  • Bảng biểu quyết với các trường bỏ phiếuID (chỉ mục), postID và bỏ phiếu (số nguyên, 0 hoặc 1).

Ý tưởng của trường bỏ phiếu là phiếu bầu có thể được hủy bỏ. Với mục đích xếp hạng, bỏ phiếu = 0 tương đương với không có lá phiếu nào cả. (Tất cả các phiếu bầu là số phiếu bầu, không có điều gì như là số phiếu giảm giá.)

Câu hỏi là cách xây dựng truy vấn trả về N postID hàng đầu, được sắp xếp theo công thức của Paul Graham. Có khoảng 100 nghìn bài đăng hoàn toàn vì vậy nếu bạn nghĩ rằng bộ nhớ đệm của điểm số hoặc bất cứ điều gì sẽ là cần thiết, tôi rất muốn nghe lời khuyên về điều đó.

(Rõ ràng đây không phải là khoa học tên lửa và tôi chắc chắn có thể tìm ra nhưng tôi đã tìm một người ăn SQL cho bữa sáng, bữa trưa và bữa tối chỉ có thể rattle nó. Và có vẻ như có giá trị để có sẵn trên StackOverflow.)


câu hỏi liên quan:

Trả lời

19

chưa được kiểm tra:

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

Chỉ cần triển khai dự án này và có vẻ hoạt động tốt cho đến bây giờ. Sẽ làm thử nghiệm thêm và sẽ báo cáo. – 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"); 

Mã này làm việc cho tôi để làm cho một trang chủ như HN.

tin tức: là tên bảng.

noOfLike: Tổng số người dùng thích tin tức này.

created_at: TimeStamp rằng khi tin tức đó được đăng

Các vấn đề liên quan