cqwcns 发表于 2019-10-4 13:12

MYSQL批量UPDATE的语句的问题

在研究MYSQL批量UPDATE的语句,在网上找了一些资料来尝试,不知道为什么无效,请帮忙看看,谢谢。

UPDATE `dizhi`

    SET `WangGe` = CASE id
      WHEN 1 THEN 'test'
      WHEN 2 THEN 'test1'
      WHEN 3 THEN 'test2'
    END
WHERE id IN (515652,515653,515654)


一笑懸命桑 发表于 2019-10-4 13:27

oracle和sql还不一样吗   case when?你这when 1 when 2是什么条件

Haisenan 发表于 2019-10-4 14:06

先说这种情况出现在用户手里是不会发生的,只可以修改自己的,id自己添加错了,那么你在后台手动改了就行

    UPDATE yoiurtable
      SET WangGeID = CASEid
            WHEN 515652 THEN test1
            WHEN 515653 THEN test2
            WHEN 515654 THEN test3
      END
    WHERE id IN (515652,515653,515654)

WHERE部分的内容不会影响上面的执行,但是会提高sql效率。

cqwcns 发表于 2019-10-4 14:42

本帖最后由 cqwcns 于 2019-10-4 14:48 编辑

Haisenan 发表于 2019-10-4 14:06
先说这种情况出现在用户手里是不会发生的,只可以修改自己的,id自己添加错了,那么你在后台手动改了就行
...
抱歉低级错误,分享一个亲测牛B的函数。

$data = [
    ['id' => 1, 'parent_id' => 100, 'title' => 'A', 'sort' => 1],
    ['id' => 2, 'parent_id' => 100, 'title' => 'A', 'sort' => 3],
    ['id' => 3, 'parent_id' => 100, 'title' => 'A', 'sort' => 5],
    ['id' => 4, 'parent_id' => 100, 'title' => 'B', 'sort' => 7],
    ['id' => 5, 'parent_id' => 101, 'title' => 'A', 'sort' => 9],
];

/**
* 批量更新函数
* @Param $data array 待更新的数据,二维数组格式
* @param array $params array 值相同的条件,键值对应的一维数组
* @param string $field string 值不同的条件,默认为id
* @Return bool|string
*/
function batchUpdate($data, $field, $params = [])
{
   if (!is_array($data) || !$field || !is_array($params)) {
      return false;
   }

    $updates = parseUpdate($data, $field);
    $where = parseParams($params);

    // 获取所有键名为$field列的值,值两边加上单引号,保存在$fields数组中
    // array_column()函数需要PHP5.5.0+,如果小于这个版本,可以自己实现,
    // 参考地址:http://php.net/manual/zh/function.array-column.php#118831
    $fields = array_column($data, $field);
    $fields = implode(',', array_map(function($value) {
      return "'".$value."'";
    }, $fields));

    $sql = sprintf("UPDATE `%s` SET %s WHERE `%s` IN (%s) %s", 'post', $updates, $field, $fields, $where);

   return $sql;
}

/**
* 将二维数组转换成CASE WHEN THEN的批量更新条件
* @param $data array 二维数组
* @param $field string 列名
* @return string sql语句
*/
function parseUpdate($data, $field)
{
    $sql = '';
    $keys = array_keys(current($data));
    foreach ($keys as $column) {

      $sql .= sprintf("`%s` = CASE `%s` \n", $column, $field);
      foreach ($data as $line) {
            $sql .= sprintf("WHEN '%s' THEN '%s' \n", $line[$field], $line[$column]);
      }
      $sql .= "END,";
    }

    return rtrim($sql, ',');
}

/**
* 解析where条件
* @param $params
* @return array|string
*/
function parseParams($params)
{
   $where = [];
   foreach ($params as $key => $value) {
      $where[] = sprintf("`%s` = '%s'", $key, $value);
   }
   
   return $where ? ' AND ' . implode(' AND ', $where) : '';
}

楼主你好萌 发表于 2019-10-4 14:46

条件错误:lol
页: [1]
查看完整版本: MYSQL批量UPDATE的语句的问题