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