更新表,对来自同一表

时间:2017-07-02 22:22:38

标签: php mysql

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

===================================
 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   |    0
 24-06-15 |   3    |   0   |    0
 22-05-15 |   3    |   0   |    0
===================================

第一列是操作日期(表显示指定用户ID的值为" ORDER BY date DESC" order)。第二列(称为AMOUNT)是给予(或取自)指定用户帐户的点的值(此列具有UNSIGNED属性,因此不能取负值)。第3列(称为DIR)是操作方向的二进制值(0 =取自,1 =给定)。最后一列(称为AFTER)表示每次操作后的当前点值。这表明用户在6月28日获得了45分。 7月1日,他失去了3分,当天的价值被设定为42分(45-3 = 42)。 7月2日,他获得了8分,经常账户价值为50(42 + 8 = 50)。

正如您所看到的,只有AFTER列的前3行有一个值 - 这是因为我在一年前创建的脚本在今年6月1日之前没有存储这些值(甚至没有名为AFTER的列)。自6月1日起,我被迫将这些值存储在数据库中,这是有效的,但之前的记录(在我做出更改之前)在2017年6月1日之前的操作之后没有适当的积分值(他们只有零)。所以我需要使用一些php + mysql代码更新表格(将手动执行"同步点"选项,每个用户一次)以保留"之后的所有"点数。值对每个用户都是正确的。

我想我需要:
1.获取指定用户ID的最新(按日期)AMOUNT和AFTER值,
2.在AMTER值之间加上或减去AMOUNT(取决于DIR),
3.使用AFTER的新值更新2ND ROW(存储了一个值,但它可以被覆盖,因为它应该相同),
4.获得2ND ROW的AMOUNT和AFTER,
5.向/从AFTER值添加或减去AMOUNT(取决于DIR),
6.用AFTER的新值更新3RD ROW,
7.等......等......(在最后一条记录更新之前循环完成)。

你能帮我解决一下正确的MySQL查询或查询吗?

1 个答案:

答案 0 :(得分:0)

好的,我已经完成了。经过多次检查和测试后,我终于使用了一个非常简单的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
===================================

感谢所有人!