【问题标题】: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. 我不知道如何循环这个,有没有更简单的步骤来计算每个供应商的平均评分?

【问题讨论】:

    标签: php mysql sql mysqli


    【解决方案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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2017-03-22
      • 2021-06-18
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多