You need to enable JavaScript to run this app. 如何将MySQL中相同bookingID的多条JSON行合并为单个JSON对象
优惠活动
大模型
产品
解决方案
定价
更多

如何将MySQL中相同bookingID的多条JSON行合并为单个JSON对象

问题原因

你原有SQL没有生效的核心原因有两点:

  • 未添加WHERE bookingID = 1001过滤条件,拼接了全表所有行的JSON数据
  • 未指定GROUP_CONCAT的排序规则,JSON_MERGE_PATCH规则为后面传入的JSON参数会覆盖前面参数的同名字段,如果顺序不对就会出现旧值覆盖新值的问题

可用解决方案

方案1:纯MySQL实现(要求MySQL版本≥5.7.22,支持JSON_MERGE_PATCH函数)

-- 筛选指定bookingID的记录,按ID升序拼接JSON,保证旧数据在前新数据在后
SET @json_params = (
    SELECT GROUP_CONCAT(columnJson ORDER BY ID ASC SEPARATOR ',')
    FROM booking_columns_history
    WHERE bookingID = 1001
);
-- 拼接并执行合并语句
SET @exec_sql = CONCAT('SELECT JSON_MERGE_PATCH(', @json_params, ') AS merged_json;');
PREPARE stmt FROM @exec_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

执行后返回的merged_json字段就是你需要的合并结果。

方案2:PHP代码中实现(兼容性更强,无需依赖MySQL JSON函数)

如果在PHP业务侧处理,逻辑更灵活,也更方便做异常校验,示例代码如下:

// 以PDO连接为例
$pdo = new PDO('mysql:host=你的数据库地址;dbname=你的库名;charset=utf8mb4', '数据库账号', '数据库密码');
$targetBookingId = 1001;

// 按ID升序查询指定bookingID的所有JSON数据
$stmt = $pdo->prepare("SELECT columnJson FROM booking_columns_history WHERE bookingID = ? ORDER BY ID ASC");
$stmt->execute([$targetBookingId]);
$jsonList = $stmt->fetchAll(PDO::FETCH_COLUMN);

$mergedData = [];
foreach ($jsonList as $jsonStr) {
    $currentData = json_decode($jsonStr, true);
    // 后查询到的新数据覆盖旧数据的同名字段
    $mergedData = array_merge($mergedData, $currentData);
}

// 输出最终合并结果
echo json_encode($mergedData);

内容的提问来源于stack exchange,提问作者Mahmood Sanjrani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 09:36:01