繁体   English   中英

根据先前行循环上的计算更新行

[英]Updating Row Based on computation on Previous Row Loop

我想更新行数错误的其他人的行。

Num | Name| Date Paid  | pay |old | new
1   | jon | 2014-08-01 | 100 |150 | 250
2   | jon | 2014-08-02 | 50  |250 | 300
3   | jon | 2014-08-03 | 110 |300 | 410
4   | jon | 2014-08-07 | 60  |410 | 470
5   | jon | 2014-08-09 | 200 |410 | 470
6   | jon | 2014-08-10 | 10  |410 | 470
7   | jon | 2014-08-15 | 100 |410 | 470
8   | jon | 2014-08-17 | 20  |410 | 470

示例数据库在这里

获取column(new)数量的公式是在第一个日期(即数字1)是column(pay)+ column(old)= column(new):

100+150 = 250. 

然后将250放在“旧”栏中的第二行中,依此类推。

column(pay) + column(old) = column(new): 50 + 250 = 300. 

我想更新所有错误的数据。 有没有一种方法可以将它更新为循环? 大约有400多个错误的数据,感谢您的时间和帮助...:D

column(old)的公式是前一column(new)的值,因此行号5-8的数据错误column(old)和column(new)是否有办法连续更新它?

您可以使用以下语句执行此操作:

UPDATE
    person p
INNER JOIN (
    SELECT
        p1.*, 
        p2.personID as p2id, 
        p2.oldpaidamount as old2, 
        p2.newpaidamount as new2
    FROM
        person p1
    INNER JOIN 
        person p2
    ON
        p1.personID > p2.personID
    AND
        p1.personName = p2.personName
    AND
        p2.personID = (
            SELECT 
                MAX(p3.personID)
            FROM
                person p3
            WHERE
                p3.personID < p1.personID
        )
    ) temp
ON
    p.personID = temp.personID
AND
    p.personName = temp.personName
SET
    p.newpaidAmount = temp.new2 + p.paidamount,   -- add this line to correct the newpaidamount
    p.oldpaidAmount = temp.new2
WHERE
    p.oldpaidAmount <> temp.new2

我们在同一表上实现子选择,以避免MySQL的限制,即MySQL无法在从子选择的同一表中进行选择时更新表。 我使用INNER JOIN来获取所需的值,因为第一行不需要更新。

看到它在修改过的小提琴中起作用。

注意:
您不能使用UPDATE触发器来保持最新状态,因为UPDATE触发器会自行触发,因此您应该使用存储过程进行更新。 对于INSERT操作,您可以使用BEFORE INSERT触发器来获取OldpaidAmount的正确值。

我的印象是,如果存储了payamounts的整个历史记录,那么这两列都是多余的(这是缺少150的起始列)。

    for($i=1;$i<=$totalnumberRows;$i++)
{

$mysqlUpdate = mysqli_query($con, "UPDATE
    person p
INNER JOIN (
    SELECT
        p1.*, 
        p2.personID as p2id, 
        p2.paidamount as paid2, 
        p2.oldpaidamount as old2, 
        p2.newpaidamount as new2
    FROM
        person p1
    INNER JOIN 
        person p2
    ON
        p1.personID > p2.personID
    AND
        p1.personName = p2.personName
    AND
        p2.personID = (
            SELECT 
                MAX(p3.personID)
            FROM
                person p3
            WHERE
                p3.personID < p1.personID 
                AND p3.personName = 'jon'
        )
    WHERE p1.personName = 'jon'

    ) temp
ON
    p.personID = temp.personID
AND
    p.personName = temp.personName
SET
    p.oldpaidAmount = temp.new2,
    p.newpaidAmount = temp.new2 + p.paidAmount");

}

totalnumberRows将循环更新直到最后一行的更新次数。.感谢@VMai

这是sqlfiddle LINK中的代码 它有很多Update查询,因​​为我现在不知道如何在sqlfiddle中循环,但是在php中可以使用forloop来做到这一点……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM