gpt4 book ai didi

php - MySQL:使用 Select 和 Limit 更新行

转载 作者:行者123 更新时间:2023-11-30 22:52:37 25 4
gpt4 key购买 nike

我正在尝试将表上的所有行更新为基于 LIMIT 的 for 循环的迭代值,以便分批完成更新。我从帖子中的建议中得到了启发 update multiple rows using limit in mysql? ,但这似乎给我带来了问题。该表有 2400 多行,相关字段的值为全 0。这是我的代码:

for($i = 0;$i < 7; $i++) {
$qq2_ = $db1->prepare("UPDATE ledum_orgs SET ledum_org_size = :val WHERE ledum_org_size IN (
SELECT ledum_org_size FROM (
SELECT ledum_org_size FROM ledum_orgs WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400
) tmp
)"
);
$qq2_->bindValue(':val',$i);
$qq2_->execute();
echo $i."=>".$qq2_->rowCount().", ";
}

但它似乎忽略了 LIMIT 子句,将所有 2445 行的字段设置为“1”。这是输出:

0=>0, 1=>2445, 2=>0, 3=>0, 4=>0, 5=>0, 6=>0,

谁能告诉我为什么会出现这种行为?

最佳答案

在 MySQL 中,您不能在与 in 一起使用的子查询中使用 limit。您也不能在子查询中引用正在更新的表(不使用 join)。但是,您可以将其切换为 join:

UPDATE ledum_orgs lo JOIN
(SELECT ledum_org_size
FROM ledum_orgs
WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400
) tmp
ON tmp.ledum_org_size = lo.ledum_org_size
SET lo.ledum_org_size = :val;

您可以将其简化为:

UPDATE ledum_orgs lo
SET lo.ledum_org_size = :val
WHERE ledum_org_size = '0'
ORDER BY ledum_org_name ASC
LIMIT ".($i*400).", 400

关于php - MySQL:使用 Select 和 Limit 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27691437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com