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

PHP如何按邮箱分组结果集 实现给员工发送逾期任务汇总邮件

优化实现方案

你现有方案的核心性能问题是循环内发起数据库查询,待办任务量大时会产生大量数据库请求,也就是常见的N+1查询问题,所有筛选和关联逻辑都可以直接放到SQL中一次性完成,性能提升明显。

优化后的查询逻辑直接通过JOIN关联员工表,把未归档、非完成状态、逾期的筛选条件全部放到SQL层面执行,避免PHP层循环判断和多次查库:

// 一次性查询所有符合条件的逾期任务+对应员工邮箱
$sql = <<<SQL
SELECT 
    t.todoID,
    t.mitarbeiterFID as mitarbeiterID,
    m.email as mitarbeiterEmail,
    -- 发邮件需要的其他任务字段也可以在这里直接查出来
    t.title,
    t.durchfuehrung as deadline
FROM todo t
LEFT JOIN mitarbeiter m ON t.mitarbeiterFID = m.mitarbeiterID
WHERE 
    t.archiv = 0
    AND t.status != 3
    AND t.durchfuehrung IS NOT NULL
    AND t.durchfuehrung < CURDATE()
SQL;

$abfrage = $db->prepare($sql);
$abfrage->execute();
$overdue_array = $abfrage->fetchAll(PDO::FETCH_ASSOC);

按邮箱分组的实现方法

不管是用优化后的查询结果还是你原有逻辑得到的$overdue_array,都可以通过以下逻辑按员工邮箱分组,得到每个员工对应的全部逾期待办列表:

$grouped_tasks = [];
foreach ($overdue_array as $task) {
    $email = $task['mitarbeiterEmail'];
    // 首次遇到该员工邮箱时初始化分组结构
    if (!isset($grouped_tasks[$email])) {
        $grouped_tasks[$email] = [
            'employee_id' => $task['mitarbeiterID'],
            'email' => $email,
            'overdue_todos' => []
        ];
    }
    // 将当前任务加入对应员工的逾期列表
    $grouped_tasks[$email]['overdue_todos'][] = $task;
}

// 后续遍历$grouped_tasks即可给每个员工发送汇总邮件
foreach ($grouped_tasks as $employee_tasks) {
    $to = $employee_tasks['email'];
    $todo_list = $employee_tasks['overdue_todos'];
    // 拼装邮件内容发送逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:02