如何循环表中的每个值并找到平均值
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. totalratings 和 totalno 的值在 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】:您可以像这样简化所需的解决方案,而不是所有这些复杂的事情:
(假设:我假设 vendorid、ratings、totalratings 和 totalno 列的类型为 INT
)
使用下面的语句/查询来获取每个vendorid对应的totalratings和totalno。
$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
包含新 totalratings 和 totalno 的行,否则 INSERT
包含 vendorid 的新行,totalratings 和 totalno。
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]
【讨论】:
以上是关于如何循环表中的每个值并找到平均值的主要内容,如果未能解决你的问题,请参考以下文章