php 组合 mYSql CASE WHERE 多字段 批量更新 sql
程序员文章站
2022-06-17 08:11:59
1、概述 转眼到18年了,从大二暑假到软件公司到至今,也满一年了,从未发表过文章。今天且记录这个功能。 作为一个刚入门的程序员,代码存不规范,代码中有错误,请各位看到本文章的大神们指点,在下感激不尽 2、代码 3、调用 1, 单个字段 生成的sql 2 多个字段 生成的sql 4、结束 下面这个,不 ......
1、概述
转眼到18年了,从大二暑假到软件公司到至今,也满一年了,从未发表过文章。今天且记录这个功能。
作为一个刚入门的程序员,代码存不规范,代码中有错误,请各位看到本文章的大神们指点,在下感激不尽
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、结束
下面这个,不知到怎么删除了
上一篇: 松软科技web课堂:字符串方法和属性
下一篇: 要开心,搞笑的逗事儿不能少