Php 按降序选择MySQL行时平衡帐户-代码更新
在金融跟踪器上工作时,遇到了一个小问题,即按降序(从最新到最旧)显示交易,并显示正确的运行余额。 以下是我正在使用的SQL:Php 按降序选择MySQL行时平衡帐户-代码更新,php,mysql,Php,Mysql,在金融跟踪器上工作时,遇到了一个小问题,即按降序(从最新到最旧)显示交易,并显示正确的运行余额。 以下是我正在使用的SQL: 按id DESC、date DESC从交易订单中选择金额、收款人、类别、日期 我正在使用一个类来处理这个应用程序的其他方面,显示交易的功能是其中的一部分。如果按升序显示事务,则以下代码将按预期工作: //Fetch the transactions public function fetchTransactions() { global $db; $thi
按id DESC、date DESC从交易订单中选择金额、收款人、类别、日期
我正在使用一个类来处理这个应用程序的其他方面,显示交易的功能是其中的一部分。如果按升序显示事务,则以下代码将按预期工作:
//Fetch the transactions
public function fetchTransactions() {
global $db;
$this->getStartingBalance();
$runningTotal = $this->startingBalance;
$fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id, date");
while ($transactionDetails = $fetchTransactionsSQL->fetch()) {
$payee = stripslashes($transactionDetails[payee]);
$category = $transactionDetails['cat'];
$amount = money_format("%n", $transactionDetails[amount]);
$runningTotal = $runningTotal + $transactionDetails['amount'];
$runningTotalOutput = money_format("%n", $runningTotal);
echo "
<tr>
<td class=\"payee\">$payee</td>
<td>$category</td>
<td>$amount</td>
<td class=\"runningTotal\">$runningTotalOutput</td>
</tr>";
}
}
我将从起始余额与查询中的第一笔交易匹配的点开始按升序读取值
将所有内容添加到包含收款人、金额、类别等的数组中,并在其中计算余额。然后将该数组添加到另一个数组$transactions[]=$transaction
然后,当您准备好输出时,从$transactions中向后读取并输出它们
for ($i = sizeof($transactions) - 1; $i >= 0; ++$i) {
$txn = $transactions[$i];
// output data
}
将数据库访问与其他逻辑分离,并将数据库和控制器逻辑与html输出分离是一个好主意,原因有很多。请参阅维基百科。为什么不从当前的平衡点开始,向后工作?因此,第一笔交易的运行余额将是开始余额,然后从开始余额中减去当前交易金额,即下一笔交易的运行余额
从交易记录中运行总和(金额)
记住结果并将其添加到您的$startingBalance中,并将其记为$endingBalance
运行查询以按所需顺序选择所有事务
对于每笔交易,从$endingBalance中减去$amount,而不是将$amount添加到$running balance中
示例:
按描述顺序选择的5笔交易(仅金额):
1. -7
2.10
3.22
4. -17
5. -2
交易总额:$tSum=-7+10+22-17-2=6
$startingBalance=300
$endingBalance=$startingBalance+tSum=300+6=306
按描述顺序显示的交易记录:
(金额|运行平衡)
期末余额:306
-7 | 306($endingBalance)
10 | 313($endingBalanse-=-7)
22 | 303($endingBalance-=10)
-17 | 281($endingBalance-=22)
-2 | 298($endingBalance-=-17)
起始余额:300($endingBalance-=-2)
您的代码已更新:
//Fetch the transactions public
function fetchTransactions()
{
global $db;
$this->getStartingBalance();
$endingBalance = $this->startingBalance + $this->getTransactionsSum();
$runningTotal = $endingBalance;
$prevAmount = 0;
$fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC");
while ($transactionDetails = $fetchTransactionsSQL->fetch())
{
$payee = stripslashes($transactionDetails[payee]);
$category = $transactionDetails['cat'];
$amount = money_format("%n", $transactionDetails[amount]);
$runningTotal -= $prevAmount;
$prevAmount = $amount;
$runningTotalOutput = money_format("%n", $runningTotal);
echo "<tr>
<td class=\"payee\">$payee</td>
<td>$category</td>
<td>$amount</td>
<td class=\"runningTotal\">$runningTotalOutput</td>
</tr>";
}
}
function getTransactionsSum()
{
$sql = $db->query("SELECT SUM(amount) AS mySum FROM transactions");
if( $sumFields = $sql->fetch() )
{
return money_format("%n", $sumFields[mySum]);
}
else
{
return 0;
}
}
//获取公共事务
函数fetchTransactions()
{
全球$db;
$this->getStartingBalance();
$endingBalance=$this->startingBalance+$this->getTransactionsSum();
$runningTotal=$endingBalance;
$prevAmount=0;
$FetchTransactionSql=$db->query(“按id说明、日期说明从交易订单中选择金额、收款人、类别、日期”);
而($transactionDetails=$FetchTransactionSQL->fetch())
{
$paye=stripslashes($transactionDetails[paye]);
$category=$transactionDetails['cat'];
$amount=money_格式(“%n”,$transactionDetails[amount]);
$runningTotal-=$prevAmount;
$prevAmount=$amount;
$runningTotalOutput=money\u格式(“%n”,$runningTotal);
回声“
美元受款人
$category
美元金额
$runningTotalOutput
";
}
}
函数getTransactionsSum()
{
$sql=$db->query(“从事务中选择金额作为mySum”);
如果($sumFields=$sql->fetch())
{
返回货币_格式(“%n”,$sumFields[mySum]);
}
其他的
{
返回0;
}
}
我希望您已经发现了有用的…什么是$this->启动余额?如果您指定一个月,它是否获得指定日期约束的起始余额?起始余额是将其添加到应用程序时帐户的初始余额。例如如果用户开始时有$359,则会将其与帐户表中的帐户名称和类型一起保存。余额是通过将交易的总和(金额的有符号整数)加到起始金额来计算的。这看起来很有希望,我们将在稍后进行尝试。我正在努力解决的另一个问题是,如何将所有这些内容放到分页索引中,而不丢弃所有内容。例如,从最近的事务开始,每页30个事务。谢谢你的帮助,我想就是这样了。我会考虑分页索引,并在明天之前解决一些问题。。。我很高兴能帮上忙。非常感谢!我的“日班工作”是24小时轮班的,只要我有能力,我就会做这件事。恭喜你赢得了赏金,真的很感激。
//Fetch the transactions public
function fetchTransactions()
{
global $db;
$this->getStartingBalance();
$endingBalance = $this->startingBalance + $this->getTransactionsSum();
$runningTotal = $endingBalance;
$prevAmount = 0;
$fetchTransactionsSQL = $db->query("SELECT amount, payee, cat, date FROM transactions ORDER BY id DESC, date DESC");
while ($transactionDetails = $fetchTransactionsSQL->fetch())
{
$payee = stripslashes($transactionDetails[payee]);
$category = $transactionDetails['cat'];
$amount = money_format("%n", $transactionDetails[amount]);
$runningTotal -= $prevAmount;
$prevAmount = $amount;
$runningTotalOutput = money_format("%n", $runningTotal);
echo "<tr>
<td class=\"payee\">$payee</td>
<td>$category</td>
<td>$amount</td>
<td class=\"runningTotal\">$runningTotalOutput</td>
</tr>";
}
}
function getTransactionsSum()
{
$sql = $db->query("SELECT SUM(amount) AS mySum FROM transactions");
if( $sumFields = $sql->fetch() )
{
return money_format("%n", $sumFields[mySum]);
}
else
{
return 0;
}
}