2009-06-17 44 views
3

在基於CodeIgniter的PHP網站上,用戶可以獲得各種操作的聲望,與Stack Overflow不同。每獲得一次信譽,就會在MySQL表中創建一個新條目,其中包括user_id,獎勵的行爲以及該點數的價值(例如10點信譽)。同時,users表中的字段reputation_total被更新。如何計算不同時間跨度的積分總數百分等級?

因爲所有這些都沒有參考框架是沒有意義的,所以我想向所有用戶顯示它們的百分比等級。對於整體聲譽來說,這似乎很容易。假設我的user_id1138。只需要將users表中的用戶數量與reputation_total少於我的數量相比較,然後對用戶總數進行計數,然後進行分配,以找到名譽低於我的用戶的百分比。這將是用戶1138的百分比排名,對不對?簡單!

但是我也在不同的時間跨度上顯示聲望總數 - 例如,在過去七天內賺取的費用,包括查詢聲望表並累計自給定日期以來所賺取的所有積分。我還希望顯示不同時間段的百分位數 - 例如,我可能是整體的第11百分位,但本月爲第50百分位,今天爲第97百分位。

看來我將不得不經過並找出所有用戶在給定時間範圍內的聲譽總數,然後看看我在該組中的位置,不是嗎?這不是非常麻煩嗎?什麼是最好的方法來做到這一點?

非常感謝。

回答

1

我能想到的幾個選項關閉我的頭頂部位置:

  1. 正如你在時間範圍內累計所獲得的聲望點,並基於此計算百分比等級。

  2. 跟蹤更新到reputation_total每天的基礎上 - 讓你有一個表的user_id,日期,reputation_total。

  3. 爲每個時間範圍在用戶表中添加一些新的列(reputation_total,reputation_total_today,reputation_total_last30days等)。你也可以歸到這一個單獨的表(reputation_totals),以防止您不必添加新列要跟蹤每個時間跨度。

選項#1是最簡單的,但它可能會很慢,如果你有大量的行以你的名譽事務表 - 它不會規模非常好,特別是如果你需要在實際計算這些時間。

選項#2將需要隨着時間的推移更多的存儲空間(每個用戶每天一列),但很可能比直接查詢事務表顯著更快。

選項#3是不太靈活,但很可能是最快的選項。

兩個選項2 & 3可能需要批處理來計算每日的總計,因此這也是需要考慮的問題。

我不認爲任何選項都是最好的 - 它們都涉及速度/存儲空間/複雜性/靈活性的不同折衷。你所做的最終將取決於你的應用課程的要求。

1

我不明白爲什麼這太複雜。一般來說,所有你需要的是添加到您的WHERE子句限制類似結果的查詢:

WHERE DatePosted between @StartOfRange and @EndOfRange 
+1

不復雜,沒有 - 但我必須爲每個用戶都這樣做,對嗎?雖然這不會很複雜,但是這不會是...好...慢嗎? – Toph 2009-06-17 13:56:07