我想更新行-不同的人的行有错误的数量。
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
样本数据库在这里
获取列(新)数量的公式是,在第一个日期,即数字1是列(支付)+列(旧)=列(新的):
100+150 = 250.
则250将被放在Old中的列中的第二行中,依此类推
column(pay) + column(old) = column(new): 50 + 250 = 300.
我想更新所有错误的数据。有没有一种方法可以为循环或任何事情更新它?大约有400多个数据是错误的,感谢您的时间和帮助…:D
列(旧)的公式是前一列(新)的值,所以第5-8行有错误的数据列(旧的)和列(新的)有办法继续更新吗?
您可以使用以下语句来完成此操作:
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的限制,即在子选择中从相同的表中进行选择时不能更新表。我使用INNER JOIN来获得所需的值,因为第一行不需要更新。
看看它在改装后的小提琴里工作。
注意:
不能使用UPDATE触发器来保持最新状态,因为UPDATE触发器会触发它自己,所以应该使用存储过程进行更新。对于INSERT操作,您可以使用BEFORE INSERT触发器来获得OldpaidAmount的正确值。
我的印象是,如果paidamounts的整个历史都被存储起来,那么这两列都是多余的(这是缺少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中的代码!!它有很多更新查询,因为我现在不知道如何在sqlfiddle中循环,但在php中,你可以使用forloop来完成这一点,谢谢。。。