欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php 组合 mYSql CASE WHERE 多字段 批量更新 sql

程序员文章站 2022-06-17 08:11:59
1、概述 转眼到18年了,从大二暑假到软件公司到至今,也满一年了,从未发表过文章。今天且记录这个功能。 作为一个刚入门的程序员,代码存不规范,代码中有错误,请各位看到本文章的大神们指点,在下感激不尽 2、代码 3、调用 1, 单个字段 生成的sql 2 多个字段 生成的sql 4、结束 下面这个,不 ......
1、概述

      转眼到18年了,从大二暑假到软件公司到至今,也满一年了,从未发表过文章。今天且记录这个功能。
作为一个刚入门的程序员,代码存不规范,代码中有错误,请各位看到本文章的大神们指点,在下感激不尽

2、代码
 1  /**
 2      * 组合批量更新sql
 3      * @param $aPkIds       主键id的值
 4      * @param array $afield 更新字段数组
 5      * @param array $data   数据
 6      * @param $aTable       表信息
 7      * @return mixed
 8      */
 9     private function updateAll($aPkIds,$afield=[],$data=[],$aTable){
10 
11         $pxIdStr=is_array($aPkIds)?implode(',', $aPkIds):$aPkIds;
12         
13         if(empty($pxIdStr)||empty($afield)||empty($data)){
14             echo '$pkId,$afield,$data不能为空';
15             exit;
16         }
17         
18         //是否传入表主键id和表名称
19         if(empty($aTable['pkId'])||empty($aTable['table_name'])){
20             $returnData['msg']='pkId,table_name不能为空';
21             exit;
22         }
23 
24         $afieldSql=[];
25         //组合批量更新字段sql
26         foreach ($data as $dataItem){
27             if(empty($dataItem['id'])){
28                 echo '更新主键id为空,请核对数据后重试';
29                 exit;
30             }
31             //循环组合更新字段更新值
32             foreach ($afield as $afieldKey=>$afieldItem){
33                 //移除运’+‘算符
34                 $afieldItemNew =trim(preg_replace('/\+/',"", $afieldItem));
35                 if(!array_key_exists($afieldItemNew,$dataItem)){
36                     echo '未找到需要更新的键值';
37                     exit;
38                 }
39                 $tempField=strstr($afieldItem,'+')==true?$afieldItem:''; //如果是运算更新 THEN 字段名 + 更新值 否则 THEN 更新值
40                 $afieldSql[$afieldItem].='WHEN '.$dataItem['id'].' THEN '.$tempField.' '.$dataItem[$afieldItemNew].' ';
41             }
42         }
43 
44         //组合批量更新头和尾
45         $updateSql= "UPDATE ".TAB_PF.$aTable['table_name'].' ';
46         $sql='';
47         $connector=count($afieldSql)>0?',':'SET '; //更新多个字段使用,
48         
49         //组合多个字段更新sql片段
50         foreach ($afieldSql as $afieldSqlKey=>$afieldSqlItem){
51             //移除运算符
52             $updateField =trim(preg_replace('/\+/',"", $afieldSqlKey));
53             $sql.=$connector.$updateField.' = CASE '.$aTable['pkId'].' '.$afieldSqlItem.'END';
54         }
55         
56         $sql=count($afieldSql)>0?' SET '.ltrim($sql,','):$sql; //多个字段 $sql变量 第一个字段加上 “SET” 并移除 第一个字段前面的","
57         $updateSql.=$sql.' WHERE '.$aTable['pkId'].' IN ('.$pxIdStr.')';
58         unset($afieldSql);
59         return $updateSql;
60     }
3、调用

1, 单个字段

 1        $data=[
 2                     '0' =>[
 3                         'id' => 8393,
 4                         'goods_number' => 5,
 5                         'last_update' => 1516339645,
 6                     ],
 7                     '1' =>[
 8                         'id' => 8397,
 9                         'goods_number' => 20,
10                         'last_update' => 1516339645,
11                     ]
12                 ];
13                 $goodsSkuStockPkIds='8393, 8397';
14                 $aUpdateField=['goods_number'];
15                 $aUpdateTable=[
16                     'pkId'=>'id',
17                     'table_name'=>'centerbin_goods_stock',
18                 ];
19        $this->updateAll($goodsSkuStockPkIds,$aUpdateField,$data,$aUpdateTable);

生成的sql

UPDATE 表名
SET goods_number = CASE id
WHEN 8393 THEN 5
WHEN 8397 THEN 20
END WHERE id IN (8393, 8397)

2 多个字段

$data=[
                    '0' =>[
                        'id' => 8393,
                        'goods_number' => 5,
                        'last_update' => 1516339645,
                    ],
                    '1' =>[
                        'id' => 8397,
                        'goods_number' => 20,
                        'last_update' => 1516339645,
                    ]
                ];
                $goodsSkuStockPkIds='8393, 8397';
                $aUpdateField=['goods_number','last_update'];
                $aUpdateTable=[
                    'pkId'=>'id',
                    'table_name'=>'centerbin_goods_stock',
                ];
                $this->updateAll($goodsSkuStockPkIds,$aUpdateField,$data,$aUpdateTable);

生成的sql

UPDATE 表名
 SET goods_number = CASE id
 WHEN 8393 THEN  5
 WHEN 8397 THEN  20 
END,
last_update = CASE id
 WHEN 8393 THEN  1516339645
 WHEN 8397 THEN  1516339645
END WHERE id IN (8393, 8397)

 

4、结束

下面这个,不知到怎么删除了