如何循环表中的每个值并找到平均值

Posted

技术标签:

【中文标题】如何循环表中的每个值并找到平均值【英文标题】:How to loop for every value in table AND find average 【发布时间】:2017-01-21 20:34:46 【问题描述】:

我是一名初级程序员,我正在尝试查找供应商 2 的平均用户评分。 我的步骤如下: 1. 用户“Jimmy”对供应商 2 的评分为 3(评分为 5 分) 2.TABLE 供应商已更新 3. ratingstot.php 然后计算 ratingstot.php 在 ALL 供应商之前 ratings响应数 的总和 ALL strong>更新中 TABLE vendortotalratings 如下所示 4.用户“Jimmy”点击“查看平均用户评分” 5. totalratingstotalno 的值在 javascript 中检索和划分

var average= totalratings/totalno

6。 totalno 显示给用户 Jimmy。结束

问题 1. 我需要帮助在 ratingtot.php 中形成 for 或 while 循环来计算评级和否。属于供应商 X 的响应在将它们插入到每个供应商的 vendortotalratings 表中之前的数量。ratingstot.php

<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
error_reporting(E_ERROR);
try
    //Database connection
    $conn = new mysqli("localhost", "XXXXXXXX_XXX", "XXXXXXXX", "XXXXXXXX");

    //Unsure how to loop this to make vendor new value every loop
    for($i=0; $i<=6; $i++)
    $vendor = ??

        //Calculate sum of ratings from table ratings
        $result = $conn->query("SELECT SUM(ratings) FROM ratings WHERE vendorid = '".$vendorid."' ");
        $row = mysqli_fetch_array($result);
        $totalratings = $row[0];

        //Calculate no. of responses (by counting no. of rows)
        $result1 = $conn->query("SELECT * FROM ratings WHERE vendorid = '" . $vendorid."' ");
        $totalno = mysqli_num_rows($result);

        //inserting the results into the table
        $query  = " UPDATE vendortotalratings SET ";
        $query .= " totalratings = '". $totalratings ."', totalno='".$totalno."' ";
        $query .= " WHERE vendorid = '". $vendorid ."'";
        $result2 = $conn->query($query);

    
    echo($outp);


catch(Exception $e) 
    $json_out =  "[".json_encode(array("result"=>0))."]";
    echo $json_out; 

?>
    我不知道如何循环这个,有没有更简单的步骤来计算每个供应商的平均评分?

【问题讨论】:

【参考方案1】:

您可以像这样简化所需的解决方案,而不是所有这些复杂的事情: (假设:我假设 vendoridratingstotalratingstotalno 列的类型为 INT )

使用下面的语句/查询来获取每个vendorid对应的totalratingstotalno

$result = $conn->query("SELECT vendorid, SUM(ratings) as totalratings, COUNT(userid) as totalno FROM vendorratings GROUP BY vendorid");

现在使用while() 循环遍历$result 结果集。

while($row = $result->fetch_array())
    ...

在上述while()循环的每次迭代中,检查vendorid值是否已经存在。如果存在,则 UPDATE 包含新 totalratingstotalno 的行,否则 INSERT 包含 vendorid 的新行,totalratingstotalno

while($row = $result->fetch_array())
    $res = $conn->query("SELECT vendorid FROM vendortotalratings WHERE vendorid = " . $row['vendorid']);
    if($res->num_rows)
        // Update the existing row
        $conn->query("UPDATE vendortotalratings SET totalratings = ".$row['totalratings'].", totalno = ".$row['totalno']." WHERE vendorid = ".$row['vendorid']);
        echo "Affected rows: " . $conn->affected_rows . '<br />';
    else
        // Insert a new row
        $res = $conn->query("INSERT INTO vendortotalratings VALUES(".$row['vendorid'].", ".$row['totalratings'].",".$row['totalno'].")");
        if($res) echo "New row inserted <br />";
    

所以try-catch 块的完整代码应该是这样的:

// your code

try
    //Database connection
    $conn = new mysqli("localhost", "XXXXXXXX_XXX", "XXXXXXXX", "XXXXXXXX");

    $result = $conn->query("SELECT vendorid, SUM(ratings) as totalratings, COUNT(userid) as totalno FROM vendorratings GROUP BY vendorid");
    while($row = $result->fetch_array())

        $res = $conn->query("SELECT vendorid FROM vendortotalratings WHERE vendorid = " . $row['vendorid']);
        if($res->num_rows)
            // Update the existing row
            $conn->query("UPDATE vendortotalratings SET totalratings = ".$row['totalratings'].", totalno = ".$row['totalno']." WHERE vendorid = ".$row['vendorid']);
            echo "Affected rows: " . $conn->affected_rows . '<br />';
        else
            // Insert a new row
            $res = $conn->query("INSERT INTO vendortotalratings VALUES(".$row['vendorid'].", ".$row['totalratings'].",".$row['totalno'].")");
            if($res) echo "New row inserted <br />";
        
    
catch(Exception $e) 
    $json_out =  json_encode(array("result"=>0));
    echo $json_out; 

【讨论】:

这正是我一直在寻找的,但更好的是,它现在正在工作,非常感谢您的回复!【参考方案2】:

这个问题没有说明记录是如何首先插入到vendortotalratings 表中的。因此,假设此表中已经有每个供应商的记录,您不必编写一个全新的循环。

更新vendortotalratings SQL 可以在单个查询中计算总评分及其计数,然后可以替换您拥有的循环。

UPDATE vendortotalratings vtr
       INNER JOIN 
       (    
         SELECT vendorid, SUM(ratings) AS sumratings, COUNT(ratings) AS countratings 
                FROM vendoratings 
         GROUP BY vendorid
       ) vr
    ON  vtr.vendorid    =   vr.vendorid
    SET 
       vtr.totalratings =   vtr.totalratings + vr.sumratings
      ,vtr.totalno      =   vtr.totalno      + vr.countratings 

计算平均值: 至于第二个问题,要计算平均值,您可以运行以下查询,该查询将为您提供运行时结果:

SELECT vendorid, totalratings, totalno, 
       CAST((totalratings/totalno) AS DECIMAL(10, 2)) AS avgrating 
FROM vendortotalratings;

变量avgrating可以通过使用$row['avgrating']直接在PHP中访问,如果你从结果中获取一个关联数组,或者使用适当的索引号,在这种情况下应该是$row[3]

【讨论】:

以上是关于如何循环表中的每个值并找到平均值的主要内容,如果未能解决你的问题,请参考以下文章

我们如何访问以列表形式存在的字典中的值? [复制]

平均矩阵中的唯一值

如何平均单个 PostGIS 栅格表中的所有波段?

如何在我的循环中找到所有测试分数的最高、最低和平均值?

Pandas:交换一个数据框中的特定列值并计算其加权平均值

从表中的“最后”N 行获取平均值