Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何循环表中的每个值并找到平均值_Php_Mysql_Sql_Mysqli - Fatal编程技术网

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

Php 如何循环表中的每个值并找到平均值,php,mysql,sql,mysqli,Php,Mysql,Sql,Mysqli,我是一名初级程序员,我正在努力寻找供应商2的平均用户评级。 我的步骤如下: 1.用户“Jimmy”给供应商2的评分为3(评分为5分) 2.更新了表Vendorations 3.然后,ratingstot.php计算更新前所有供应商的评级和响应总数,如下所示 4.用户“Jimmy”点击“查看平均用户评级” 5.在Javascript中检索并划分值totalratings和totalno var average= totalratings/totalno 六,。totalno显示给用户Jimm

我是一名初级程序员,我正在努力寻找供应商2的平均用户评级。
我的步骤如下:
1.用户“Jimmy”给供应商2的评分为3(评分为5分)
2.更新了表Vendorations
3.然后,ratingstot.php计算更新前所有供应商的评级和响应总数,如下所示

4.用户“Jimmy”点击“查看平均用户评级”
5.在Javascript中检索并划分值totalratings和totalno

var average= totalratings/totalno
六,。totalno显示给用户Jimmy。结束

问题
1.我需要帮助在ratingstot.php中形成for或while循环,以计算属于供应商X的评分和响应数量,然后再将它们插入每个供应商的vendor TotalRatings表中。
ratingstot.php


这个问题并没有说明这些记录是如何首先插入到
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;

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

,而不是所有这些复杂的东西,您可以简化所需的解决方案,如下所示: (假设:我假设vendorid、ratings、totalratings和totalno列的类型为
INT

  • 使用下面的语句/查询获取每个供应商ID对应的totalratings和totalno

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

    while($row = $result->fetch_array()){
        ...
    }
    
  • 在上述
    while()
    循环的每次迭代中,检查vendorid值是否已经存在。如果存在,则
    使用新的totalratings和totalno更新该行,否则
    插入包含vendorid、totalratings和totalno的新行


    这正是我一直在寻找的,但更好的是,它现在正在工作,非常感谢您的回复!
    $result = $conn->query("SELECT vendorid, SUM(ratings) as totalratings, COUNT(userid) as totalno FROM vendorratings GROUP BY vendorid");
    
    while($row = $result->fetch_array()){
        ...
    }
    
    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 />";
        }
    }
    
    // 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; 
    }