用 PHP 计算总平均评分

Posted

技术标签:

【中文标题】用 PHP 计算总平均评分【英文标题】:Count total Average rating with PHP 【发布时间】:2017-12-03 10:42:40 【问题描述】:

我将如何运行 PDO 查询,然后使用 php 处理结果以根据用户输入的评论输出特定空白的平均评分?

每条评论都根据 2 个标准加权,即服务和价格。这两个都是 0-5,因此最终平均得分为 10。每个评论基础我目前使用以下代码来计算特定评论的平均评分。

$rating_total = $row['review_service_rating'] + $row['review_price_rating'];

$average_rating = ($rating_total / 100) * 100; 

因此,对于每条评论,review_service_rating 和 review_price_rating 都有 2 条 sql 行,这两者都满分 5。

但是我不确定如何计算所有评分,然后确定特定页面的基本评分(满分 10 分)。

假设我们有 3 条评论。此评论是 7/10、8/10 和 10/10。从逻辑上讲,我们会将所有数字相加,然后将所有 /10 相加给我们。 25/30 转换为 83.33 或在我的情况下为 8/10。这是我不确定如何做的两个步骤。

1 - 从 SQL 获取所有评级并计算它们

2 - 根据所有评分确定平均值 /10

用于从数据库中提取数据的当前 PDO 代码以及每个特定用户拥有的评论数。

$q = $db->prepare("SELECT * FROM reviews WHERE assigned_id = :review_id ORDER BY review_posted DESC");
         $q->execute(array(':review_id' => $_GET['page_id']));

         $r = $q->fetchAll(PDO::FETCH_ASSOC);

         echo '<br><div class="well">Average Rating</div><br>';

         foreach($r as $row) 

         $q = $db->prepare("SELECT * FROM users WHERE user_id = :review_user_id");
         $q->execute(array(':review_user_id' => $row['user_id']));
         $r = $q->fetch(PDO::FETCH_ASSOC);

         $q = $db->prepare("SELECT COUNT(*) FROM reviews WHERE user_id = :review_user_id");
         $q->execute(array(':review_user_id' => $row['user_id']));
         $user_reviews = $q->fetchColumn();

【问题讨论】:

不是$average_rating = ($rating_total / 100) * 100 只是$rating_total 我一直在标签和问题中看到 PDO,但我没有看到任何与数据库相关的内容。在大多数情况下,数据库可以为您计算平均值 SELECT ( AVG(review_service_rating) + AVG(review_price_rating) ) AS average_rating, COUNT(review_service_rating) AS num_service_rating, COUNT(review_price_rating) AS num_price_rating FROM reviews WHERE assigned_id = :review_id ORDER BY review_posted DESC 对你有用吗?由于平均值从 0 到 5 不等,只需将它们相加即可得到 0 到 10 的总和。 @0111010001110000 你有它。当您添加平均值时,结果低于 10。因此,如果您得到 7.1,只需附加字符串 /10。如果您需要百分比,( 7.1 / 10 ) * 100 (= 71%) 会给您。 @0111010001110000 我建议你退后一步,重新考虑你的方法。在我看来,你做了一个简单的连接到一个循环和很多查询。您使用的“加权”和“平均”这两个词实际上并不是您在这里处理的。您只是将 2 个数字相加。 【参考方案1】:

假设每个用户给 x 点(限制为 10),你必须将它们相加(x)然后除以 rating_times,你得到平均评分。

例如

 User 1 rate 7
 User 2 rate 6 
 User 1 rate 5

 => (7+6+5)/3 = 6

因此,您只需在用户评分时添加一个名为 point 的字段。 然后使用查询 SUM 到 SUM point 向上,除以查询 COUNT 然后完成。 忘记 (x**/10**)。

最后,使用 2 个平均评分(价格和服务),将它们的总和除以 2 得到总体评分。

【讨论】:

所以根据我的理解,我必须添加标准#1(服务)和标准#2(价格),这将给我一个 10 个组合点的值(每个标准加权 5) .在那之后,我会为 Jake 摩托车维修店计算总评论数。 SQL 将返回 3 条评论。之后我会运行数学。 这样的? function sum($a, $b) return $a + $b; $average_rating = explode('.', (string)(array_reduce($ratings, 'sum') / sizeof($ratings)))[0] . '%';【参考方案2】:

这就是你可能想要做的事情:

$q = $db->prepare("
      SELECT * 
      FROM review r 
          JOIN users u ON r.user_id=u.id  
          JOIN (SELECT user_id, COUNT(1) as count FROM review GROUP BY user_id) uc ON uc.user_id = u.id 
      WHERE r.assigned_id=:review_id 
      ORDER BY r.review_posted DESC");
$q->execute(array(':review_id' => $_GET['page_id']));
$r = $q->fetchAll(PDO::FETCH_ASSOC);

foreach ($r as $row) 
     // $row should have all fields included in $tables review and users as well as $row[count] would contain the total number of reviews a user made

这将包括用户的详细信息以及带有 assigned_id 的每条评论的评分详细信息

编辑:也添加了用户评论的总和。

【讨论】:

试图添加你的代码,打破了页面哈哈。无论如何,这里是 Review 页面的完整代码。 pastebin.com/raw/0m8b7Ycq @0111010001110000 可能值得做一个print_r($r); die() 以查看此查询的结果如何(假设它有效,我尚未对其进行测试)并查看它是否可以使用。 将值更改为正确的值并且它可以工作。有点愚蠢的问题,但我现在用什么来为每个用户显示 x 条评论?【参考方案3】:

你可以使用这个sn-p。 这帮助了我 https://gist.github.com/tiagofrancafernandes/1c5752ba2ebeb477975c6c016a37fc5c

【讨论】:

以上是关于用 PHP 计算总平均评分的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 如何计算listview上每个产品的平均评分数

使用 linq 计算 EF Core 中的平均评分

spark数据分析练习

spark示例:连接操作

从豆瓣电影评分算法说起

您将如何计算 IMDB 电影评分?