如何用MySQL与PHP实现员工表按姓名ID合并州字段的报表
解决MySQL员工表State合并问题
最优方案:使用MySQL的GROUP_CONCAT函数
直接在数据库层面完成分组和字符串合并,效率更高且代码更简洁:
SQL查询语句
SELECT Name, ID, GROUP_CONCAT(State SEPARATOR ', ') AS States FROM employee WHERE Name IN ('Bob', 'Joe') GROUP BY Name, ID ORDER BY Name;
对应PHP代码
// 执行分组查询 $query = "SELECT Name, ID, GROUP_CONCAT(State SEPARATOR ', ') AS States FROM employee WHERE Name IN ('Bob', 'Joe') GROUP BY Name, ID ORDER BY Name"; $result = mysqli_query($dbc, $query); // 输出表格 echo '<table> <tr> <th>Name</th> <th>ID</th> <th>States</th> </tr>'; while ($row = mysqli_fetch_assoc($result)) { // 使用htmlspecialchars防止XSS注入 echo '<tr> <td>' . htmlspecialchars($row['Name']) . '</td> <td>' . htmlspecialchars($row['ID']) . '</td> <td>' . htmlspecialchars($row['States']) . '</td> </tr>'; } echo '</table>';
纯PHP处理方案(若需在代码层处理)
如果必须通过PHP逻辑实现分组合并,修正后的代码如下:
// 初始化分组数组,用「姓名-ID」作为唯一键 $employeeGroups = []; // 查询数据 $result = mysqli_query($dbc, "SELECT * FROM employee WHERE Name IN ('Bob', 'Joe')"); while ($row = mysqli_fetch_assoc($result)) { $groupKey = $row['Name'] . '-' . $row['ID']; // 初始化分组 if (!isset($employeeGroups[$groupKey])) { $employeeGroups[$groupKey] = [ 'Name' => $row['Name'], 'ID' => $row['ID'], 'States' => [] ]; } // 将State加入对应分组 $employeeGroups[$groupKey]['States'][] = $row['State']; } // 输出表格 echo '<table> <tr> <th>Name</th> <th>ID</th> <th>States</th> </tr>'; foreach ($employeeGroups as $emp) { $statesStr = implode(', ', $emp['States']); echo '<tr> <td>' . htmlspecialchars($emp['Name']) . '</td> <td>' . htmlspecialchars($emp['ID']) . '</td> <td>' . htmlspecialchars($statesStr) . '</td> </tr>'; } echo '</table>';
原代码的问题分析
- 变量错误:
$row3['state']应为$row['state'],$states1应为$state1,导致State收集失败或错误。 - 无分组逻辑:所有State被存入同一个数组,最后仅输出一次,无法对应到每个员工。
- 去重逻辑冗余且不可靠:通过
<br>和逗号分割再去重的方式容易出现格式错误,且无法保证Name和ID的对应关系。
内容的提问来源于stack exchange,提问作者cdr1
相关产品推荐
相关产品推荐

