PHP+MYSQL批量UPDATE循环拼接语句

yyn查看全部>> 10-05

人气 82

语句示例:

UPDATE xx 
    SET a = CASE c 
        WHEN 1 THEN 'a'
        WHEN 2 THEN 'b'
        WHEN 3 THEN 'c'
    END, 
    b = CASE c 
        WHEN 1 THEN '1111'
        WHEN 2 THEN '2222'
        WHEN 3 THEN '3333'
    END
WHERE c IN (1,2,3)

问题已解决:

$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],
];
 
/**
* 批量更新函数
* [url=home.php?mod=space&uid=952169]@Param[/url] $data array 待更新的数据,二维数组格式
* @param array $params array 值相同的条件,键值对应的一维数组
* @param string $field string 值不同的条件,默认为id
* [url=home.php?mod=space&uid=155549]@Return[/url] 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) : '';
}
标签
相关作品
PHP+MYSQL批量UPDATE循环拼接语句:等您坐沙发呢!



会员登陆还没有账号 立即注册

用户登录

忘记密码 ?

用第三方帐号直接登录

微博账号登陆 QQ账号登陆