如何用PHP将SQL中同ID多产品数据合并为单行展示
解决同一ID多产品合并为单行的问题
方法一:SQL层直接合并(推荐,更高效)
用MySQL的GROUP_CONCAT函数直接在查询阶段合并同一ID下的产品,返回结果天然是每个ID对应一行,产品用指定分隔符拼接完成。
示例SQL语句:
SELECT id, GROUP_CONCAT(product_name SEPARATOR ', ') AS merged_products FROM your_table_name GROUP BY id;
SEPARATOR可自定义,比如用' | '或者'<br>'(适配网页输出场景)- 若产品存在重复,可添加
DISTINCT去重:GROUP_CONCAT(DISTINCT product_name SEPARATOR ', ')
PHP端直接读取结果即可,无需额外处理:
// 假设已完成数据库连接,$conn为连接实例 $result = mysqli_query($conn, "SELECT id, GROUP_CONCAT(product_name SEPARATOR ', ') AS merged_products FROM your_table_name GROUP BY id"); while ($row = mysqli_fetch_assoc($result)) { echo "ID: {$row['id']}, 产品: {$row['merged_products']}<br>"; }
方法二:PHP层处理结果集
如果无法修改SQL(比如需要保留原字段结构做其他操作),可以在PHP中遍历原始结果,用数组分组实现合并。
问题根源
你之前的代码只保留第一个产品,大概率是直接把每条记录赋值给数组时,后续同ID的记录覆盖了之前的,没有做累加操作。
修正代码示例
// 1. 获取所有原始记录(按ID排序保证同ID记录连续) $stmt = $pdo->query("SELECT id, product_name FROM your_table_name ORDER BY id"); $rawData = $stmt->fetchAll(PDO::FETCH_ASSOC); // 2. 初始化空数组存储合并后的数据 $mergedData = []; // 3. 遍历原始数据分组 foreach ($rawData as $item) { $id = $item['id']; $product = $item['product_name']; if (!isset($mergedData[$id])) { // 首次遇到该ID,初始化结构 $mergedData[$id] = [ 'id' => $id, 'products' => [] ]; } // 将产品添加到对应ID的产品列表中 $mergedData[$id]['products'][] = $product; } // 4. 将产品列表转为字符串(按需调整分隔符) foreach ($mergedData as &$row) { $row['products'] = implode(', ', $row['products']); } unset($row); // 解除引用,避免后续操作意外修改 // 5. 输出合并后的数据 foreach ($mergedData as $row) { echo "ID: {$row['id']}, 合并产品: {$row['products']}<br>"; }
内容的提问来源于stack exchange,提问作者Naveen
相关产品推荐
相关产品推荐

