首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL使用assoc数组更新同一查询中的多个用户行

MySQL使用assoc数组更新同一查询中的多个用户行
EN

Stack Overflow用户
提问于 2017-08-31 14:17:07
回答 2查看 87关注 0票数 1

我有一个如下所示的用户数组:array(1 => 10, 2 => 11 ...and so on for 100k+ values);

我目前正在遍历每个用户以更新db行。它很慢,~30秒。

代码语言:javascript
复制
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个。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-31 14:38:44

这是不可能的,您只能按$plan_length进行分组,然后可以使用如下查询:

代码语言:javascript
复制
/*
  $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值是不同的,那么这意味着您必须对每个用户执行一个查询。每个请求可以执行多个查询。

代码语言:javascript
复制
$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));
票数 0
EN

Stack Overflow用户

发布于 2017-08-31 14:43:58

您可以编写这样的更新查询。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45983710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档