Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 - Fatal编程技术网

Php 使用对同一表中的值的数学运算更新表

Php 使用对同一表中的值的数学运算更新表,php,mysql,Php,Mysql,我想用同一个表中的值的数学运算结果更新表单元格。下面您可以看到我的表格(这是指定用户ID的结果): 第一列是操作日期(表中显示了具有“ORDER BY date DESC”顺序的指定用户ID的值)。第二列(称为AMOUNT)是指定用户帐户的点数(或从中获取的点数)(此列具有未签名属性,因此不能获取负值)。第三列(称为DIR)是操作方向的二进制值(0=取自,1=给定给)。最后一列(后面称为)表示每次操作后的当前点值。这表明在6月28日,用户得到了45分。7月1日,他丢了3分,当天的积分被设置为42

我想用同一个表中的值的数学运算结果更新表单元格。下面您可以看到我的表格(这是指定用户ID的结果):

第一列是操作日期(表中显示了具有“ORDER BY date DESC”顺序的指定用户ID的值)。第二列(称为AMOUNT)是指定用户帐户的点数(或从中获取的点数)(此列具有未签名属性,因此不能获取负值)。第三列(称为DIR)是操作方向的二进制值(0=取自,1=给定给)。最后一列(后面称为)表示每次操作后的当前点值。这表明在6月28日,用户得到了45分。7月1日,他丢了3分,当天的积分被设置为42(45-3=42)。7月2日,他获得了8分,活期账户价值为50(42+8=50)。

如您所见,只有AFTER列的前3行有一个值-这是因为我在一年前创建的脚本直到今年6月1日才存储这些值(甚至没有调用AFTER列)。自6月1日起,我被迫将这些值存储在DB中,这是可行的,但之前的记录(在我进行更改之前)在2017年6月1日之前的操作后没有正确的点值(它们只有零)。因此,我需要使用一些php+mysql代码(将作为“sync points”选项手动执行,每个用户一次)更新一个表,以使所有“points after”值对每个用户都正确

我想我需要:
1.获取指定用户ID的最新(按日期)金额和后值,
2.在值后面加上或减去金额(取决于目录),
3.使用AFTER的新值更新第二行(存储了一个值,但可以覆盖它,因为它应该是相同的),
4.获取第二行和之后的金额,
5.在值后面加上或减去金额(取决于目录),
6.使用AFTER的新值更新第三行,
7.等等(在循环中执行所有操作,直到更新最后一条记录)。


你能帮我做一个或多个正确的MySQL查询吗?

好的,我已经做了。经过多次检查和测试,我最终使用了一个非常简单的PHP代码和一个更简单的MySQL查询:

$sql = 'SELECT * FROM points_log WHERE user_id = '.(int)$_GET['u_id'].' ORDER BY date DESC'; // gets all records for specified user ID
$result = $db->sql_query($sql);
$previous = $db->sql_fetchrow($result); // processes the first row and prepares the data for further use

$after = $previous['after']; // gets the most recent value of points

while ($row=$db->sql_fetchrow($result)) {
    $id = $previous['id']; // unique ID of the first row
    $amount = $previous['amount']; // amount from the first row
    $dir = ($previous['dir'] == 0) ? true : false; // direction of operation (0 = taken from, 1 = given to)

    if ($dir) {
        $sql = 'UPDATE points_log SET after='.$after.'+'.$amount.' WHERE id='.$row['id']; //adds points to the current value if they were subtracted previously
        $db->sql_query($sql);
        $after = $after+$amount; // sets new value of $after variable
    } else {
        $sql = 'UPDATE points_log SET after='.$after.'-'.$amount.' WHERE id='.$row['id']; //subtracts points from the current value if they were added previously
        $db->sql_query($sql);           
        $after = $after-$amount; // sets new value of $after variable
    }
    $previous = $row; // sets previous row with all its values as a current row (required to process all the rows one by one in a loop)
}
$db->sql_freeresult($result);
我现在可以根据每个用户的请求手动更新积分日志。您可以在下面找到结果:

===================================
 DATE     | AMOUNT |  DIR  | AFTER
===================================
 02-07-17 |   8    |   1   |   50
 01-07-17 |   3    |   0   |   42
 28-06-17 |   3    |   0   |   45
 14-11-15 |   8    |   1   |   48
 24-06-15 |   3    |   0   |   40
 22-05-15 |   3    |   0   |   43
===================================

谢谢大家

您需要修改格式“按日期获取最后一笔金额”。我没有看到任何日期。是的,我真的很抱歉。感谢戈登的编辑。@Gordon Linoff-你可以把任何你喜欢的日期放在那里。此表显示了指定用户ID(未显示为列)的值以及“ORDER BY date DESC”顺序(日期也未显示,因为我认为描述我的问题并不重要)。@Vogelek23。我想你没抓住重点。这是你的问题。这是你的数据。如果你想要建设性的答案,你应该努力做到尽可能准确。
===================================
 DATE     | AMOUNT |  DIR  | AFTER
===================================
 02-07-17 |   8    |   1   |   50
 01-07-17 |   3    |   0   |   42
 28-06-17 |   3    |   0   |   45
 14-11-15 |   8    |   1   |   48
 24-06-15 |   3    |   0   |   40
 22-05-15 |   3    |   0   |   43
===================================