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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:45:33