mysql 批量更新多条记录的方法:
UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' END WHERE id IN (1,2,3)
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。
这样一条sql语句就可以实现多数据多字段的更新了!
/** * 分页批量更新点播评论数 * @author wzq */ public function update_video_comment() { // 分页批量更新点播表里面每个视频的评论字段 $count = $this->_getCountVideoComment(); $limit = 1000; // 分页数 if(!empty($count)) { $total = count($count); $cur = 0; $startInfo = ''; // 日志用 while ($cur < $total) { $commentData = $this->_getVideoComment($cur, $limit); // 分类汇总查询出每条有评论的点播评论数和视频id $videoIds = ''; $when = ''; foreach ($commentData as $key => $value) { $videoIds .= "," . $value['video_id']; $when .= " WHEN " . $value['video_id'] . " THEN " . $value['c']; } $videoIds = substr($videoIds, 1); $updateSql = "UPDATE video_info SET review_num = CASE id $when END WHERE id IN ( $videoIds )"; $this->exec($updateSql); $cur += $limit; $startInfo .= json_encode($commentData[0]) . ','; } // 记录日志 $this->CI->load->library('Mlog'); $msg = "更新视频评论总条数: $total ; 每次分页数: $limit ; 每页起始视频id: " . $startInfo; $this->CI->mlog->Info(__LINE__, $msg, 'update_video_comment'); } }
推荐日志展现形式: