我有一个如下所示的用户数组:array(1 => 10, 2 => 11 ...and so on for 100k+ values);
我目前正在遍历每个用户以更新db行。它很慢,~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。他说:如果用PDO解决方案是可能的,我们将使用PDO。
Ps。3: plan_length的值是用户参与计划的月数,目前的最大值是20个。
发布于 2017-08-31 14:38:44
这是不可能的,您只能按$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));发布于 2017-08-31 14:43:58
您可以编写这样的更新查询。
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, [....])https://stackoverflow.com/questions/45983710
复制相似问题