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');
        }
    }

推荐日志展现形式:

image.png