吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1758|回复: 4
收起左侧

[求助] MYSQL批量UPDATE的语句的问题

[复制链接]
cqwcns 发表于 2019-10-4 13:12
在研究MYSQL批量UPDATE的语句,在网上找了一些资料来尝试,不知道为什么无效,请帮忙看看,谢谢。

[SQL] 纯文本查看 复制代码
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)


0.png
1.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

一笑懸命桑 发表于 2019-10-4 13:27
oracle和sql还不一样吗   case when?你这when 1 when 2是什么条件
Haisenan 发表于 2019-10-4 14:06
先说这种情况出现在用户手里是不会发生的,只可以修改自己的,id自己添加错了,那么你在后台手动改了就行

    UPDATE yoiurtable
        SET WangGeID = CASE  id
            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的函数。

[PHP] 纯文本查看 复制代码
$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
条件错误
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表