如何将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
相关产品推荐
相关产品推荐

