2011-06-20 24 views
1

給定一個數據庫表具有以下字段:如何創建一個mysql_query,用於抽取使用貝葉斯平均值排序的項目?

  • total_votes:投這個項目/行
  • AVERAGE_VALUE投票總數:平均投票值(即3.6與5爲最高)
  • total_value:所有的票值的總和(4即3票將導致12)

我只是使用SELECT搶行和ORDER BY通過其平均值對他們進行排序,但隨後我遇到了一個很好的問題10票平均4.9得到超過一個全新的排名,只有1票5票超過它。

經過一番研究,我發現最受歡迎的排序評分項目的方法是使用貝葉斯平均值。

br = ((avg_num_votes * avg_rating) + (this_num_votes * this_rating))/(avg_num_votes + this_num_votes) 

不過,我有困難的創建,拉這些行和我在創造任何東西的MySQL查詢方面提出了一個新手使用此平均值對其進行排序的查詢。

我正在尋找的是:

$results = mysql_query("INSERT ANSWER HERE"); 

哪裏INSERT ANSWER HERE是你爲我提供和$results提供這些物品分類由平均的貝葉斯答案。

有關平均貝葉斯更多信息,我檢查了:http://www.thebroth.com/blog/118/bayesian-rating

+2

'$ results = mysql_query(「INSERT ANSWER HERE」);'讓我笑 –

+0

哈哈。我很高興它給你帶來了一些喜悅。小前提示技巧指南說徹底。 :-) –

回答

1

一個簡單的方法是使用兩個查詢。也許這將這樣的伎倆

查詢#1

SELECT 
    AVG(total_votes) AS avg_num_votes, 
    AVG(average_value) AS avg_rating 
FROM 
    MyThings 
WHERE 
    total_votes > 0 

這應該給你的所有項目的avg_num_votes(即至少有一票),並在所有的項目對那些AVG_RATING(再次至少一票)。

有了這些價值觀,構建查詢#2和使用ORDER BY:

查詢#2

SELECT 
    thing_id 
    thing_name 
FROM 
    MyThings 
ORDER BY 
    (($avg_num_votes * $avg_rating) + (total_votes * average_value))/($avg_num_votes + total_votes) 

之前提交此查詢,替換$avg_num_votes$avg_rating與查詢#結果1。

警告:還沒有測試過這個,我對貝葉斯排名並不熟悉。

希望有幫助!

+0

謝謝,隊友,真棒迴應。我最終編寫了一個PHP腳本,在每次投票時將平均值發佈到自己的字段中,並通過cron作業每隔一段時間更新一次,因爲隨着站點票數的增長,值會發生變化。 –