如何通过SQL查询将同一会议的参会人姓名合并为逗号分隔格式?
问题需求
我通过以下代码从数据库获取会议及参会人数据:
$allmeetings = Db::select('select t_meetings.item_id, t_meetings.title, t_contacts.name, t_meetings.date_start from t_meetings, t_participants, t_contacts where t_meetings.item_id = t_participants.meeting_first_id and t_participants.app_reference2_first_id = t_contacts.item_id order by t_meetings.item_id');
当前查询返回的数组格式如下:
$arr = [ 0 => [ 'item_id' => 11, 'title' => 'Work Life Balance', 'name' => 'Selena', 'date_start' => '2012-11-20 12:30:00' ], 1 => [ 'item_id' => 11, 'title' => 'Work Life Balance', 'name' => 'John', 'date_start' => '2012-11-20 12:30:00' ], 2 => [ 'item_id' => 12, 'title' => 'Mental Wellness', 'name' => 'David', 'date_start' => '2011-10-19 12:30:00' ], 3 => [ 'item_id' => 12, 'title' => 'Mental Wellness', 'name' => 'Tom', 'date_start' => '2011-10-19 12:30:00' ], ];
但我希望将同一会议的参会人姓名合并为逗号分隔的字符串,得到如下格式的数组:
$arr = [ 0 => [ 'item_id' => 11, 'title' => 'Work Life Balance', 'name' => 'Selena,John', 'date_start' => '2012-11-20 12:30:00' ], 1 => [ 'item_id' => 12, 'title' => 'Mental Wellness', 'name' => 'David, Tom', 'date_start' => '2011-10-19 12:30:00' ], ];
解决方案
有两种方式可以实现该需求:
方式一:数据库层面直接聚合(推荐)
修改SQL查询,使用GROUP_CONCAT函数拼接同一会议的参会人姓名,配合GROUP BY完成分组:
select t_meetings.item_id, t_meetings.title, GROUP_CONCAT(t_contacts.name SEPARATOR ', ') as name, t_meetings.date_start from t_meetings join t_participants on t_meetings.item_id = t_participants.meeting_first_id join t_contacts on t_participants.app_reference2_first_id = t_contacts.item_id group by t_meetings.item_id, t_meetings.title, t_meetings.date_start order by t_meetings.item_id
PHP代码保持调用逻辑不变,直接执行上述SQL即可得到聚合后的结果,这种方式性能更优,尤其适合数据量较大的场景。
方式二:PHP层面处理数组
如果无法修改SQL语句,可以在PHP中遍历原始数组,手动合并同一会议的参会人信息:
$mergedMeetings = []; foreach ($allmeetings as $meeting) { $id = $meeting['item_id']; if (!isset($mergedMeetings[$id])) { // 首次遍历到该会议,初始化数据 $mergedMeetings[$id] = $meeting; $mergedMeetings[$id]['name'] = [$meeting['name']]; } else { // 已存在该会议,追加参会人姓名 $mergedMeetings[$id]['name'][] = $meeting['name']; } } // 将姓名数组转为逗号分隔字符串,并重置数组索引 $result = array_map(function($item) { $item['name'] = implode(', ', $item['name']); return $item; }, array_values($mergedMeetings));
最终变量$result即为目标格式的数组。
内容的提问来源于stack exchange,提问作者Dijo Dill
相关产品推荐
相关产品推荐

