【sql】CAST(GROUP_CONCAT())实现一对多对象json输出

数据库:mysql 5.7版本以上

问题:一对多数据,实现输出一条数据,并将多条数据转换成json对象输出,可以实现一对多个字段。

项目中关系较为复杂,以下简化数据关系如下:

t1是数据表,t2是用户表,一条数据,对应授权给多个用户,给出每条数据,对应授权所有用户和用户名信息

SELECT
	t1.id,
	CAST( GROUP_CONCAT( json_object( 'id', t2.user_id 'name', t2.name)) AS CHAR ( 10000 ) CHARACTER SET utf8 ) AS jsonStr 
FROM
	t1
	LEFT JOIN t2 ON t1.id = t2.user_id 
GROUP BY
	t1.id

结果:

05033d2aa90823bb7ea09851    {"id": "01", "name": "张三"}
150aa723a9ae1e60d6e2c646    {"id": "02", "name": "王五"},{"id": "04", "name": "李四"}
254e636931f52799432933de    {"id": null, "name": null}

ps:如果连表数据为空,这里任然有json{"id": null, "name": null}

(sql server好像可以用null no null去掉null值,但是mysql语法不支持,好可惜)

这种sql,结果有一个弊端,json字符串无法直接转换成List的json对象,需要加中括号[]

方案一:java代码中拼接

 StringBuffer stringBuffer = new StringBuffer();
                stringBuffer.append("[");
                stringBuffer.append(data.get("shareJsonStr"));
                stringBuffer.append("]");
 List<Map<String, String>> shareJsonList = JSONArray.parseObject(stringBuffer.toString(), List.class);
            

方案二:concat函数实现

SELECT
	t1.id,
	CAST( CONCAT('[',GROUP_CONCAT( json_object( 'id', t2.user_id 'name', t2.name)),']') AS CHAR ( 10000 ) CHARACTER SET utf8 ) AS jsonStr 
FROM
	t1
	LEFT JOIN t2 ON t1.id = t2.user_id 
GROUP BY
	t1.id

结果:

05033d2aa90823bb7ea09851    [{"id": "01", "name": "张三"}]
150aa723a9ae1e60d6e2c646    [{"id": "02", "name": "王五"},{"id": "04", "name": "李四"}]
254e636931f52799432933de     [{"id": null, "name": null}]

但是我在项目中并未使用方案二,而是使用方案一

因为在复杂情况下,方案二的处理速度过慢,不如在代码中使用括号拼接速度快。

我查询资料,理论上数据库执行会比java中拼接快,可能与具体场景、数据索引、数据库版本执行速度有关。

大数据量场景需要具体问题具体分析。


知识点:

1.json_object函数,将多个字段转成一个json对象,这里用了两个字段。

json_object( 'id', t2.user_id 'name', t2.name)

        mysql需要5.7版本,其他数据库大多数有次函数

2.CAST函数,json输出类型转换

CAST( json AS CHAR ( 10000 ) CHARACTER SET utf8 )

        数据库json对象是二进制,输出字符串需要转换成utf8的方式。

        其中char(10000)代表字符最长字段

        mysql可以使用此函数也可以是用convert函数,但是convert其他数据库不一定支持,相对cast通用性更高。

3.GROUP_CONCAT函数,进行分组拼接多条jason对象为一个字符串输出

GROUP_CONCAT( json_object( 'id', t2.user_id 'name', t2.name))...GROUP BY t1.id

5.使用中需要加中括号[],实现json的list解析使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948992.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉技术 - 人脸生成】2.GAN网络的构建和训练

GAN 是一种常用的优秀的图像生成模型。我们使用了支持条件生成的 cGAN。下面介绍简单 cGAN 模型的构建以及训练过程。 2.1 在 model 文件夹中新建 nets.py 文件 import torch import torch.nn as nn# 生成器类 class Generator(nn.Module):def __init__(self, nz100, nc3, n…

手机投屏到电视的3种选择:无线本地投屏,无线远程投屏,AirPlay投屏

现在大部分手机投屏都要求连接相同的WiFi&#xff0c;这就意味着手机投屏到电视必须是近距离投屏&#xff0c;稍微远一点就会脱离WiFi连接范围&#xff0c;投屏失败。 如果想将手机远程投屏到安卓电视&#xff0c;要怎样做&#xff1f; 第一步&#xff0c;在手机和安卓电视都安…

zookeeper 数据类型

文章目录 引言I Znodezonde stat (状态信息)znode类型临时\永久序列化特性引言 在结构上与标准文件系统非常类似,拥有一个层次的命名空间,都是采用树形层次结构 Zookeeper树中的每个节点被称为:Znode,没有文件和目录之分。Znode兼具文件和目录两种特点Znode存储数据大小有…

73 mysql replication 集群的交互

前言 新建两个数据库, 分别为 192.168.220.132:3001, 192.168.220.132:3002 设置 192.168.220.132:3001 为 master, 192.168.220.132:3002 为 slave 配置文件如下 然后使用 mysqld --initialize 来初始化 data 目录, 以及相关基础数据库 这里会为 root 账户创建一个随机的…

CG顶会论文阅读|《科技论文写作》硕士课程报告

文章目录 一、基本信息1.1 论文基本信息1.2 课程基本信息1.3 博文基本信息 二、论文评述&#xff08;中英双语&#xff09;2.1 研究问题&#xff08;Research Problem&#xff09;2.2 创新点&#xff08;Innovation/Contribution&#xff09;2.3 优点&#xff08;Why this pape…

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…

嵌入式驱动开发详解8(阻塞/非阻塞/异步通信)

文章目录 前言阻塞非阻塞异步通知后续 前言 首先来回顾一下“中断”&#xff0c;中断是处理器提供的一种异步机制&#xff0c;我们配置好中断以后就 可以让处理器去处理其他的事情了&#xff0c;当中断发生以后会触发我们事先设置好的中断服务函数&#xff0c; 在中断服务函数…

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型(敏感性分析方法)

【MATLAB第112期】基于MATLAB的SHAP可解释神经网络回归模型&#xff08;敏感性分析方法&#xff09; 引言 该文章实现了一个可解释的神经网络回归模型&#xff0c;使用BP神经网络&#xff08;BPNN&#xff09;来预测特征输出。该模型利用七个变量参数作为输入特征进行训练。为…

DeepSeek-V3 正式发布,已在网页端和 API 全面上线,性能领先,速度飞跃。

DeepSeek-V3 在推理速度上相较历史模型有了大幅提升。在目前大模型主流榜单中&#xff0c;DeepSeek-V3 在开源模型中位列榜首&#xff0c;与世界上最先进的闭源模型不分伯仲。 简介 DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型&#xff0c;总共有 671B 个参数&#xff0c;…

深度评测uni-app x:开启跨平台开发新篇章

文章目录 一、引言1.1 跨平台开发的崛起1.2 uni-app x 初印象 二、uni-app x 核心特性评测2.1 uts 语言&#xff1a;跨平台编程新利器2.2 uvue 渲染引擎&#xff1a;原生渲染新体验2.3 强大的组件和 API 支持2.4 插件生态&#xff1a;拓展无限可能 三、与 uni-app 对比&#xf…

用python编写一个放烟花的小程序

import pygame import random # 代码解释及使用说明&#xff1a; # 首先&#xff0c;导入 pygame 和 random 库。pygame 用于创建游戏窗口和图形绘制&#xff0c;random 用于生成随机数。 # 初始化 pygame&#xff0c;并设置屏幕尺寸为 800x600 像素&#xff0c;设置窗口标题为…

Android设备使用AOA协议进行主机与配件模式通信

1.使用TYPC-C数据线连接两台华为手机&#xff1a; TYPE-C线&#xff0c;先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权&#xff0c;然后会启动右边的AccessoryChart USB HOS…

flutter在windows平台中运行报错

PS D:\F\luichun> flutter run当运行flutter项目时&#xff0c;【解决如下报错】 /C:/flutter/packages/flutter/lib/src/painting/star_border.dart:530:27: Error: The getter Matrix4 isnt defined for the class _StarGenerator.- _StarGenerator is from package:flut…

ROS2软件架构全面解析-学习如何设计通信中间件框架

前言 ROS&#xff08;Robot Operating System&#xff09; 2 是一个用于开发机器人应用的软件平台&#xff0c;也称为机器人软件开发工具包 (SDK)。 ROS2是ROS1的迭代升级版本 &#xff0c;最主要的升级点是引入DDS&#xff08;Data Distribution Service&#xff09;为基础的…

【C++】B2093 查找特定的值

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出示例 &#x1f4af;题目分析与解题思路&#x1f4af;代码实现与对比分析我的实现代码老师的实现代码详细对比与分析1. 数组的定义方式2. …

SAP 01-初识AMDP(ABAP-Managed Database Procedure)

1. 什么是AMDP(ABAP-Managed Database Procedure) 1.&#xff09;AMDP - ABAP管理数据库程序&#xff0c;是一种程序&#xff0c;我们可以使用SQLSCRIPT在AMDP内部编写代码&#xff0c;SQLSCRIPT是一种与SQL脚本相同的数据库语言&#xff0c;这种语言易于理解和编码。 将AM…

基于 gitlab-runner 实现调度GPU的资源

本篇目录 1. 客户需求2. 需求调研3. 实践3.1 方案一&#xff1a;环境变量的方式3.2 方案二&#xff1a;k8s 自身的spec注入机制 4. 效果 该实践来自于客户的一个真实需求 1. 客户需求 客户的某些流水线需要使用GPU资源&#xff0c;但是对于GPU服务器而言&#xff0c;会有多张G…

走进深圳华为总部参观研学

在这个科技日新月异的时代&#xff0c;每一次与行业标杆企业领先者对话&#xff0c;都是开眼界的好时机。华研标杆游学高老师组织了一场企业家参访团体考察&#xff0c;带大家去到深圳华为总部研学&#xff0c;亲身感受科技巨头的风采&#xff0c;一起探讨未来的发展。 第一站-…

客户案例:基于慧集通(DataLinkX)集成平台的金蝶云星空公有云与WMS系统对接集成方案

本文档详细介绍了基于慧集通&#xff08;DataLinkX&#xff09;集成平台的金蝶云星空公有云与WMS系统对接集成方案。该方案旨在实现金蝶云星空与WMS系统之间的数据同步和流程对接&#xff0c;以提高企业供应链管理的效率和准确性。通过物料、供应商资料同步&#xff0c;采购、销…

【Kaggle】练习赛《预测贴纸的销量》(上)

前言 本篇文章介绍的是2025年首个Kaggle月赛《Forecasting Sticker Sales》&#xff0c;即《预测贴纸的销量》。与之前一样&#xff0c;也同样适合初学者&#xff0c;但与之前不同的是&#xff0c;本次比赛的数据集是个时间序列&#xff0c;从题目来看&#xff0c;就是通过之前…