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

如何在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处理,步骤如下:

  1. 先查询全量相关数据
SELECT * FROM menu WHERE org = 1 ORDER BY mid ASC;
  1. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 12:18:01