You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量处理群组成员时,如何统计并输出INSERT与UPDATE操作行数?

批量处理群组成员数据:实现INSERT/UPDATE逻辑并统计操作结果

需求说明

  • 批量处理用户数据,判断用户是否已加入群组:
    • 已加入:更新其group_id为当前群组ID
    • 未加入:执行INSERT操作,同时更新另一张关联表
  • 统计UPDATE和INSERT的总行数
  • 根据统计结果生成对应的通知内容

代码实现

核心逻辑修改

将原有仅INSERT的逻辑,改为先判断用户是否存在,再分支执行UPDATE/INSERT,并同步统计操作行数:

// 初始化操作计数器
$updateCount = 0;
$insertCount = 0;
$currentGroupId = $_SESSION['group_id'];

$db = new Database();

foreach($data as $user_id => $user_info) {
    $userPosition = $user_info["position"];

    // 1. 检查用户是否已在群组成员表中
    $db->query("SELECT group_id FROM group_members WHERE user_id = :user_id LIMIT 1");
    $db->bind(":user_id", $user_id);
    $db->execute();
    $existingGroup = $db->single();

    if ($existingGroup) {
        // 用户已存在:执行UPDATE并累加计数
        $db->query("UPDATE group_members SET group_id = :group_id, user_position = :position WHERE user_id = :user_id");
        $db->bind(":group_id", $currentGroupId);
        $db->bind(":position", $userPosition);
        $db->bind(":user_id", $user_id);
        
        $db->execute();
        $updateCount += $db->rowCount();
    } else {
        // 用户不存在:执行INSERT,同步更新关联表并累加计数
        // 插入群组成员表
        $db->query("INSERT INTO group_members (group_id, user_id, user_position) VALUES (:group_id, :user_id, :position)");
        $db->bind(":group_id", $currentGroupId);
        $db->bind(":user_id", $user_id);
        $db->bind(":position", $userPosition);
        
        $db->execute();
        $insertCount += $db->rowCount();

        // 更新关联表(示例:根据实际业务替换表名和字段)
        $db->query("UPDATE user_profiles SET last_join_group_id = :group_id WHERE user_id = :user_id");
        $db->bind(":group_id", $currentGroupId);
        $db->bind(":user_id", $user_id);
        $db->execute();
    }
}

生成通知内容

根据统计结果生成对应格式的通知:

$total = $updateCount + $insertCount;

if ($total === 0) {
    $notification = "没有成员加入您的群组";
} elseif ($updateCount === 0) {
    // 仅新增场景
    $notification = "{$total}位成员已加入您的群组";
} else {
    // 混合场景
    $notification = "共{$total}位成员加入您的群组;其中{$insertCount}位新增,{$updateCount}位从其他群组转入";
}

// 执行通知推送(替换为实际推送逻辑:如站内信、短信等)
echo $notification;

优化建议

  • 事务保障:若需确保所有操作原子性(要么全成功,要么全失败),可添加事务处理:
    $db->beginTransaction();
    try {
        // 上述批量处理代码
        $db->commit();
    } catch (PDOException $e) {
        $db->rollBack();
        // 记录错误日志或处理异常
    }
    
  • 性能优化:数据量较大时,可先批量查询所有用户的存在状态,再分批次执行INSERT/UPDATE,减少数据库交互次数。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:50:27