我有一个用户数组,如下所示:
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。
聚苯乙烯。 2:如果PDO可以解决方案,我们将使用PDO。
聚苯乙烯。 3:plan_length的值是用户对计划的月数,目前最大值为20。
答案 0 :(得分:1)
您可以像这样编写更新查询。
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, [....])
答案 1 :(得分:0)
这是不可能的,你只能按$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));