我想显示具有最高平均值(rating_avg)和收视率(rating_count)的收视率。对于我目前的脚本,无论有多少评级,它都会显示最高的平均评级(DESC),这对我的访问者来说是无用的。
例如:
- 项目1 - 5.0(1级)
- 项目2 - 5.0(2个等级)
当它应该通过评分平均值和评分数量显示前10个最高评分的项目时,例如:
- 项目1 - 4.5(356个评级)
- 第2项- 4.3(200级)
- 项目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%的置信区间下限。