MySQL 权重评分

标签 mysql select sql-order-by rating

我想根据票数创建一个权重评级。 因此,1 票 5 票不会比 4 票 4 票好。

我找到了这个数学形式:

贝叶斯 = ( (avg_num_votes * avg_rating) + (this_num_votes * this_rating) )/(avg_num_votes + this_num_votes)

如何使 MySQL SELECT 获取最佳评分图像的 ID。

我有一张用于 IMAGE 的表和一张用于 VOTING 的表

投票:

id
imageID
totalVotes
avgVote

我想我必须在 SELECT 中使用 SELECT 来做到这一点,但是怎么做呢?

最佳答案

第一步是计算 avg_num_votesavg_rating:

SELECT
  SUM(totalVotes)/COUNT(*) AS avg_num_votes,
  SUM(avgVote)/COUNT(*) AS avg_rating
FROM voting;

如果您可以忍受小错误,偶尔计算一次可能就足够了。

现在使用您的公式和上面的值,您可以运行称重查询。作为一个小优化,我预先计算了 avg_num_votes * avg_rating 并将其命名为 avg_summand

SELECT
  voting.*, -- or whatever fields you need
  ($avg_summand+totalVotes*avgVote)/($avg_num_votes+totalVotes) AS bayesian
FROM voting
ORDER BY  bayesian DESC
LIMIT 1;

编辑

您可以将其作为连接运行:

SELECT
  voting.*, -- or whatever fields you need
  (avg_num_votes*avg_rating+totalVotes*avgVote)/(avg_num_votes+totalVotes) AS bayesian
FROM voting,
(
  SELECT
    SUM(totalVotes)/COUNT(*) AS avg_num_votes,
    SUM(avgVote)/COUNT(*) AS avg_rating
  FROM voting AS iv
) AS avg
ORDER BY  bayesian DESC
LIMIT 1;

但这会计算每个查询的总和和平均值 - 称之为性能炸弹。

关于MySQL 权重评分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13512613/

相关文章:

mysql - 脚本化 Jenkinsfile 中的多个 Docker

mysql - MYSQL 上的事件不适用于 phpmyadmin

php - 如何在 MySQL 表中的一个特定元素周围(之前和之后)选择固定数量的元素?

sql - 当结果集很大且无法按索引排序时优化 "ORDER BY"

php - 数据库未与 php 连接

php - Mysql - 删除空列以仅更新设置值

javascript - 如何在没有更改功能的情况下在标签中显示 <select> 的当前值

Mysql 选择具有相同 id 的行(3 个表)

mysql - 按当月订购月份表

sql - SQL Server 中的 Order By 将正值放在负值之前