Php 计算过去30天的平均燃油

Php 计算过去30天的平均燃油,php,mysql,average,Php,Mysql,Average,我有一个脚本,可以计算过去30天的aveage燃油消耗量,但有些用户报告计算错误 这就是我得到的: //Calculate the total km for the last 30 days $result = mysqli_query($con,"SELECT MIN(km) AS minikm, MAX(km) AS maxkm FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']."

我有一个脚本,可以计算过去30天的aveage燃油消耗量,但有些用户报告计算错误

这就是我得到的:

//Calculate the total km for the last 30 days
    $result = mysqli_query($con,"SELECT MIN(km) AS minikm, MAX(km) AS maxkm FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $mileage = $row['maxkm'] - $row['minikm'];}

//Sum up all the Liters of diesel
    $result = mysqli_query($con,"SELECT SUM(liter) AS totalfuel FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $totalfuel = $row['totalfuel'];} 

$averagefuel = $totalfuel / $mileage * 10;

在解决这个问题时,我注意到我不应该在计算的第一个记录中包括升。只有总公里数。那么我该怎么做呢?

我想你需要一直增加$miliness。试试这个:

//Calculate the total km for the last 30 days
$mileage = 0;
    $result = mysqli_query($con,"SELECT MIN(km) AS minikm, MAX(km) AS maxkm FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $mileage += $row['maxkm'] - $row['minikm'];}

//Sum up all the Liters of diesel
    $result = mysqli_query($con,"SELECT SUM(liter) AS totalfuel FROM diesel WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']." ORDER BY diesel.dato DESC");
    while($row = mysqli_fetch_array($result)){ $totalfuel = $row['totalfuel'];} 

$averagefuel = $totalfuel / $mileage * 10;
戈登·林诺夫为您提供了很好的解决方案。尝试使用以下方法:

//Calculate the total km for the last 30 days
$mileage = 0;
$result = mysqli_query($con,
"SELECT 10 * SUM(liter) / (MAX(km) - MIN(km)) as AvgFuel
FROM diesel
WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid']);
$averagefuel = $steps = 0; 
while($row = mysqli_fetch_array($result)){ 
    $averagefuel += $row['AvgFuel']; 
    $steps++; 
} 
$averagefuel = $averagefuel/$steps;

如果我不得不猜测用户的想法,问题是一个月的燃油投入与该月的燃油消耗量有些无关。换言之,油箱可能开始空-满或介于两者之间。而且,它可能会以空的、满的或介于两者之间的某个地方结束

这意味着您的计算可能会在两侧各有一个装满燃油的油箱时停止

现在,这一点可以通过特殊情况得到缓解。例如,也许这些车辆每天都在行驶,在一天结束时油箱都加满了油。所以,在午夜,你有一个合理的假设,油箱是满的。如果真是这样的话,我会感到惊讶,因为汽车的燃料库存是要花钱的。他们可以聘请我作为顾问来改善他们的资产负债表;)(为了记录在案,那不是我的专长)

作为一个小提示,您可以使用SQL进行完整的计算。您不需要使用两个查询或任何客户端计算:

SELECT 10 * SUM(liter) / (MAX(km) - MIN(km)) as AvgFuel
FROM diesel
WHERE diesel.dato >= '$dx' AND userid = ".$_COOKIE['userid'].";

考虑提供适当的DDL(和/或SQLFIDLE)以及期望的结果SET抱歉,jQuery标签出现了我的错误。也许它与问题无关,但是注意到当我在第一个记录中不包括升降机时,我注意到了SQL注入(例如$$Koice部件)。不知道怎么做。第一张唱片是什么?你能添加你在故障排除中得到的数据吗,我真的不理解你。戈登·林诺夫也为您提供了很好的解决方案。您需要使用他的查询,然后$averagefuel=$steps=0;而($row=mysqli_fetch_数组($result)){$averagefuel+=$row['AvgFuel'];$steps++;}$averagefuel=$averagefuel/$steps;我使用的是一款iphone应用程序,它可以为我计算,并显示出与我得到的不同的值。我一直期望那个应用程序是正确的,但也许我错了。该应用程序的计算方法与我在这里所做的相同,但它不包括sql查询中出现的第一条记录中的升数。我的有。然后你需要自己检查一段时间,在这种情况下,我们没有足够的数据提供帮助。这看起来比我的查询要好得多。我试试看。这是一个针对我们卡车运输公司司机的小型web应用程序。我们总是把油箱装满。每天或每2天。当我将我的平均油耗与我在iPhone上使用的平均油耗进行比较时,我发现计算结果有一个差异。不同之处在于,iphone应用程序在sql查询获取的第一条记录中不包括柴油的升数。我的是,但什么是正确的?我的web应用程序还是iphone应用程序?:)@罗格朗德森。可能介于两者之间。给定日期后的第一次“加注”可能是完全在该日期之前、之后或两者之间使用的燃油。考虑到您的业务实践,您可能会明白这一点。对于堆栈溢出,这将是一个不同的问题,有样本数据和期望的结果。