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

