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

时间:2017-08-31 14:17:07

标签: php mysql

我有一个用户数组,如下所示: 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。

2 个答案:

答案 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));