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

PHP多对多关联查询重复记录:合并项目关联公司至同一列

合并项目关联公司列的解决方案

核心修改:用SQL聚合函数合并公司名称

问题根源是多表JOIN后,每个关联公司会生成一条重复的项目记录。直接用MySQL的GROUP_CONCAT函数聚合同一项目下的公司名称,再通过GROUP BY确保每个项目只返回一条记录就能解决。

1. 调整模型的查询语句

在It_projects模型的getTableData方法中修改以下部分:

修改SELECT字段

把原来单独查询公司名称的代码,替换成GROUP_CONCAT聚合:

$select = "SELECT it_projects.ID, it_projects.title, it_projects.created, it_projects.start_date, it_projects.end_date, ";
// 用GROUP_CONCAT把同一项目的所有公司名拼接成字符串,分隔符用逗号+空格
$select .= " GROUP_CONCAT(firma.Nume SEPARATOR ', ') as company_name, ";
// 保留你原来的其他字段查询(比如assigneeFirstname、creatorFirstname等)
$select .= " ... "; // 补全原有的其他字段

添加GROUP BY子句

在查询的末尾加上GROUP BY,必须包含所有SELECT里非聚合的字段(也就是除了GROUP_CONCAT之外的所有字段),避免数据库报错:

// 原有的FROM和JOIN逻辑保留
$from = " FROM it_projects ";
$join .= " JOIN it_project_companies ON it_project_companies.project_id = it_projects.ID ";
$join .= " JOIN firma ON firma.id = it_project_companies.company_id ";

// 拼接完整查询,最后添加GROUP BY
$query = $select . $from . $join;
// 这里把SELECT里所有非GROUP_CONCAT的字段都列进去
$query .= " GROUP BY it_projects.ID, it_projects.title, it_projects.created, it_projects.start_date, it_projects.end_date, ";
$query .= " affected, assigneeFirstname, accomplished, creatorFirstname, priority, statusName, groupName ";

2. 可选:让公司名称变成可点击链接

如果需要让每个公司名是跳转链接,直接在GROUP_CONCAT里生成HTML代码就行——你的JS配置里已经设置了type: 'html',DataTables会自动解析:

$select .= " GROUP_CONCAT(CONCAT('<a href=\"/company/', firma.id, '\">', firma.Nume, '</a>') SEPARATOR ', ') as company_name, ";

3. 无需修改前端代码

你的JS列配置已经能直接读取company_name字段,现在这个字段是合并后的字符串,直接显示即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:51