簡體   English   中英

如何創建一個mysql_query來提取使用貝葉斯平均排名的項目?

[英]How can I create a mysql_query that pulls items ranked using a Bayesian average?

給定具有以下字段的數據庫表:

  • total_votes:此項目/行的總投票數
  • average_value:平均投票值(即3.6,最大值為5)
  • total_value:所有投票值的總和(即3票對4票將得到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那里找到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM