按两列排序-使用最高评级平均与大多数评级


Order By Two Columns - Using Highest Rating Average with Most Ratings

我想显示具有最高平均值(rating_avg)和收视率(rating_count)的收视率。对于我目前的脚本,无论有多少评级,它都会显示最高的平均评级(DESC),这对我的访问者来说是无用的。

例如:

  1. 项目1 - 5.0(1级)
  2. 项目2 - 5.0(2个等级)

当它应该通过评分平均值和评分数量显示前10个最高评分的项目时,例如:

  1. 项目1 - 4.5(356个评级)
  2. 第2项- 4.3(200级)
  3. 项目3 - 4.0(400评级)

这是我现在的记录:

$result = mysql_query("SELECT id, filename, filenamedisplay, console_dir, downloads, rating_avg, rating_count FROM files WHERE console_dir = '".$nodash."' ORDER BY rating_avg DESC LIMIT 10");

谢谢,我提前感谢任何帮助!

这是一个微妙的问题,也是统计学中的一个问题。我所做的通常是将评级降低一个标准误差。这些不是确切的比例,但我认为同样的想法也可以应用。

您可以使用"p*q除以n的平方根"方法来计算。如果你不明白这一点,谷歌"比例的标准误差"(或者我可能会建议第三章"使用SQL和Excel进行数据分析",其中更详细地解释了这一点):

SELECT id, filename, filenamedisplay, console_dir, downloads, rating_avg, rating_count
FROM files cross join
     (select count(*) as cnt from files where console_dir = '".$nodash."') as const
WHERE console_dir = '".$nodash."'
ORDER BY rating_avg/5 - sqrt((rating_avg/5) * (1 - rating_avg/5) / const.cnt) DESC
LIMIT 10;

无论如何,看看这个公式是否适合你。

编辑:

这里换成均值的标准误差。我应该一开始就这么做,但我认为rating_avg是一个比例。公式是标准差除以样本量的平方根。我们可以得到const子查询中的总体标准差:

     (select count(*) as cnt, stdev(rating_avg) as std from files where console_dir = '".$nodash."') as const

结果是:

order by rating_avg - std / sqrt(const.cnt)

这可能有效,但我更希望每个组内的标准差,而不是总体标准差。但是,它会根据样本的大小成比例地降低评级,这应该会改善您的结果。

顺便说一下,去掉一个标准差的想法是相当武断的。我刚刚发现它产生了合理的结果。你可能更喜欢取1.96倍的标准差,以获得95%的置信区间下限。