php - 我如何创建一个 mysql_query 来提取使用贝叶斯平均值排名的项目?

标签 php mysql

给定一个包含以下字段的数据库表:

  • 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 是您提供给我的答案,$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 替换为查询 #1 的结果。

警告:还没有测试过这个,我也不熟悉贝叶斯排名。

希望对您有所帮助!

关于php - 我如何创建一个 mysql_query 来提取使用贝叶斯平均值排名的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406616/

相关文章:

javascript - 为什么这个对 Controller 的 ajax 调用在特定页面 (Laravel) 中不起作用?

python - SQLAlchemy 连接表并在每一行中插入新字段

php - mysql_connect() 访问被拒绝

mysql - INDEX bool 字段有多必要

php - 如何从mysql中转义php中的空格和中断

php - 在数据库 MySQL 中使用 LIKE 运算符搜索 HTML

php - PHP while 循环中没有条件?

php - 使用 PHP 7.0 的 Redis 中的 Codeigniter session 错误

java - 将 jspinner 时间值插入数据库

php - 如何将 Sqlite 数据库转换为 Mysql