[英]How can I create a mysql_query that pulls items ranked using a Bayesian average?
給定具有以下字段的數據庫表:
我只是簡單地使用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
那里找到INSERT ANSWER HERE
, $results
可以按照貝葉斯平均值對這些項目進行排序。
有關貝葉斯平均數的更多信息,我簽出了: http : //www.thebroth.com/blog/118/bayesian-rating
一種簡單的方法是使用兩個查詢。 也許這可以解決問題
查詢#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
替換$avg_num_votes
查詢#1的結果。
警告:尚未測試,我對貝葉斯排名不熟悉。
希望有幫助!
因此事實證明,使用以下MySQL查詢,可以通過正確排序獲得貝葉斯平均值:
SELECT *, AVG(total_votes) * AVG(average_value) + (total_votes * average_value) / AVG(total_votes) + total_votes AS score
FROM shows
GROUP BY id
ORDER BY score DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.