如何在MySQL或PHP中基于mid与sub id匹配实现多行数据拼接为单行
需求实现方案
方案1:纯MySQL实现(适配MySQL 5.7版本)
首先明确层级关联逻辑:
- 根节点:parent字段为空的条目(当前数据中为Apple,mid=216)
- 基础款:parent等于根节点mid、sub字段为空的条目(iPhone、MacBook)
- 子型号:sub字段等于对应基础款mid的条目
对应的SQL语句如下:
SELECT CONCAT( root.item, ' ', base.price, ' ', base.item, ' ', GROUP_CONCAT(CONCAT(sub.price, ' ', sub.item) SEPARATOR ' ') ) AS product_line FROM menu root INNER JOIN menu base ON base.parent = root.mid AND base.sub = '' LEFT JOIN menu sub ON sub.sub = base.mid WHERE root.parent = '' GROUP BY root.item, base.price, base.item;
执行后返回的结果和你期望的输出完全一致。
方案2:PHP拼接实现(更易扩展维护)
如果后续需要调整拼接逻辑、增加展示字段,建议用PHP处理,步骤如下:
- 先查询全量相关数据
SELECT * FROM menu WHERE org = 1 ORDER BY mid ASC;
- 用PHP遍历拼接
// 假设已完成数据库连接,$pdo为连接实例 $stmt = $pdo->query("SELECT * FROM menu WHERE org = 1 ORDER BY mid ASC"); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); // 生成mid为索引的映射表,方便快速查找 $menuIndex = []; foreach ($rows as $row) { $menuIndex[$row['mid']] = $row; } // 筛选所有基础款 $baseList = array_filter($rows, function($item) { return $item['parent'] != '' && $item['sub'] == ''; }); $rootName = $menuIndex[216]['item']; $output = []; foreach ($baseList as $base) { $line = "{$rootName} {$base['price']} {$base['item']}"; // 匹配对应子型号 foreach ($rows as $sub) { if ($sub['sub'] == $base['mid']) { $line .= " {$sub['price']} {$sub['item']}"; } } $output[] = $line; } // 输出最终结果 foreach ($output as $line) { echo $line . PHP_EOL; }
内容的提问来源于stack exchange,提问作者stefan999
相关产品推荐
相关产品推荐

