我有一个看起来像: array(1 => 10, 2 => 11 ...and so on for 100k+ values);
我目前正在遍历每个用户以更新数据库行。非常慢,〜30秒。
foreach ($users as $user_id => $plan_length) {
mysql_query("UPDATE users SET plan_length = $plan_length WHERE id = $user_id");
}
有没有办法将其组合到1个查询中?
ps。:我知道PDO家伙,但我在这里专注于查询本身。这个客户的项目没有PDO。
ps。2:如果PDO可以解决解决方案,我们将使用PDO。
ps。3:plan_length的值是用户在计划中的月数,目前的最大值为20。
您可以编写这样的更新查询。
UPDATE
users
SET
plan_length =
CASE user_id
WHEN 1 THEN 10
WHEN 2 THEN 11
[...]
ELSE plan_length
END
WHERE
id IN(1, 2, [....])
它不可能,您只能按$plan_length
进行分组,然后您可以使用这样的查询:
/*
$users example:
$users = [
'1' => [12, 132, 456, 487],
'3' => [14, 122, 356, 547],
];
*/
foreach ($users as $plan_length => $user_ids) {
mysql_query("UPDATE users SET plan_length = $plan_length WHERE id IN ('" . implode("', '", $user_ids) . "')");
}
---更新---
如果每个用户的$plan length
值都不同,则意味着您必须每个用户进行查询。您可以根据请求执行多个查询。
$sqls = [];
$i = 0;
foreach ($users as $user_id => $plan_length) {
$sqls[] = "UPDATE users SET plan_length = $plan_length WHERE id = $user_id";
if (++$i => 500) {
mysql_query(implode('; ', $sqls));
$sqls = [];
$i = 0;
}
}
if (!empty($sqls))
mysql_query(implode('; ', $sqls));