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
相关产品推荐
相关产品推荐

