php的一个百分比统计问题
我自己做了个项目,考虑到会使用百分比排名功能,并且实现(高于、低于、持平)三个级别做对比。我想问下如果要实现图片中这样的该怎么做呢?注:画红线的地方我都实现出来了,就是这...
我自己做了个项目,考虑到会使用百分比排名功能,并且实现(高于、低于、持平)三个级别做对比。
我想问下如果要实现图片中这样的该怎么做呢?
注:画红线的地方我都实现出来了,就是这个百分比和排名计算问题。
补充一下,每次评分都是有4个选项的:
如图所示这样的,分别插入到4个字段当中(score1,score2,score3,score4)
我一开始能想到的就是这样的实现,但是好像是不正确的;
例如:
得到score1字段中的所有用户记录的总数,赋给变量$num
然后在得到该公司的评价人数,例如是80人,在将这80个score1加起来,赋给变量$usnum
然后在 sprintf('%.2f%%', $usnum / $num * 100); 得到百分比结果,可是实现起来效果还是不正确。另外如何推算排名呢?
望高手解答。 展开
我想问下如果要实现图片中这样的该怎么做呢?
注:画红线的地方我都实现出来了,就是这个百分比和排名计算问题。
补充一下,每次评分都是有4个选项的:
如图所示这样的,分别插入到4个字段当中(score1,score2,score3,score4)
我一开始能想到的就是这样的实现,但是好像是不正确的;
例如:
得到score1字段中的所有用户记录的总数,赋给变量$num
然后在得到该公司的评价人数,例如是80人,在将这80个score1加起来,赋给变量$usnum
然后在 sprintf('%.2f%%', $usnum / $num * 100); 得到百分比结果,可是实现起来效果还是不正确。另外如何推算排名呢?
望高手解答。 展开
1个回答
展开全部
4个字段没错,但要增加一个字段用于排名,这个字段存平均值,即你上面的综合评分。
否则可能导致无法使用索引。
另外这个评分是10分制,而非100分制。
字段存储的值如:8.1,8.2等直接存储10分制数值就行。
score1-4的算法:
方法一:不计效率的话,直接从数据库sum就完了
SQL: SELECT company_id, count(*) as num, sum(score1) as score1,sum(score2) as score2,sum(score3) as score3, sum(score4) as score4 from 评分表 where company_id in(1,2,3) group by company_id ;
最终得到结果,示例算法: score1 = round(score1 / num, 1);
方法二:
如果考虑效率问题,比如评论数可能会草果万,十万,百万。
则建议再增加5个字段分别存储总评分值和总评分人数。
total_score1, total_score2, total_score3, total_score4, score_num,
每次评论时增加这两个值:total_score1 = total_score1+这次评分score1,score_num = score_num + 1
最终score1 = total_score1 / score_num;
综合评分: score5 = round((score1 + score2 + score3 + score4) / 4 ,1);
排名在显示时差数据库,假设当前score5 = $socre5:
select count(*) from company where score5>$score5;
如果company 表很大,建议走计划任务跑数据。
如果表很大但我只要前100名,可以另外建一个表或者缓存,
然后在更新score5 时去判断是否在大于现在100名中的最小一名,如果是就把最小的踢掉,如果不是,就什么也不用做,当然如果这个本身就是这100名中的,那么可能比较麻烦,但是其实你不需要那么老实的存储100名,你可以存储150名,阵中用时就前100名,即便有人从100名中掉队,也可以从后面的50名中取一个上来替代到新的100名中。
否则可能导致无法使用索引。
另外这个评分是10分制,而非100分制。
字段存储的值如:8.1,8.2等直接存储10分制数值就行。
score1-4的算法:
方法一:不计效率的话,直接从数据库sum就完了
SQL: SELECT company_id, count(*) as num, sum(score1) as score1,sum(score2) as score2,sum(score3) as score3, sum(score4) as score4 from 评分表 where company_id in(1,2,3) group by company_id ;
最终得到结果,示例算法: score1 = round(score1 / num, 1);
方法二:
如果考虑效率问题,比如评论数可能会草果万,十万,百万。
则建议再增加5个字段分别存储总评分值和总评分人数。
total_score1, total_score2, total_score3, total_score4, score_num,
每次评论时增加这两个值:total_score1 = total_score1+这次评分score1,score_num = score_num + 1
最终score1 = total_score1 / score_num;
综合评分: score5 = round((score1 + score2 + score3 + score4) / 4 ,1);
排名在显示时差数据库,假设当前score5 = $socre5:
select count(*) from company where score5>$score5;
如果company 表很大,建议走计划任务跑数据。
如果表很大但我只要前100名,可以另外建一个表或者缓存,
然后在更新score5 时去判断是否在大于现在100名中的最小一名,如果是就把最小的踢掉,如果不是,就什么也不用做,当然如果这个本身就是这100名中的,那么可能比较麻烦,但是其实你不需要那么老实的存储100名,你可以存储150名,阵中用时就前100名,即便有人从100名中掉队,也可以从后面的50名中取一个上来替代到新的100名中。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询