MySQL 一对多转 JSON 格式

2024-04-26

我有两个 MySQL 表:

User (id, name)
Sale (id, user, item)

Where Sale(user)是一个外键User(id),所以这是一种一对多的关系(一个用户可以进行多次销售)。

我试图从数据库中获取它并以 JSON 格式返回给多个用户,所以它看起来像这样:

[
  {
    "id": 1,
    "name": "User 1",
    "sales": [
      {
        "id": 1,
        "item": "t-shirt"
      },
      {
        "id": 2,
        "item": "jeans"
      }
    ]
  },
  {
    "id": 2,
    "name": "User 2",
    "sales": [
      {
        "id": 3,
        "item": "sweatpants"
      },
      {
        "id": 4,
        "item": "gloves"
      }
    ]
  }
]

其中“销售”实体嵌套在其相应“用户”的实体内。

所以问题是,从数据库查询并将其转换为 JSON 的最佳方法是什么?我可以对所有用户运行查询,然后迭代每个用户并运行查询来获取他们的销售额,但这非常慢。或者,我可以在用户和销售之间进行外部联接,然后将代码解析为 JSON 格式,但这会从数据库发送多余的信息(包括每个销售的整套用户数据),并且需要循环遍历所有信息代码。有没有方便的方法来做到这一点?顺便说一句,我正在使用 Python 3.7。


这是一个可能满足您要求的 SQL 查询。它使用MySQL JSON_ARRAYAGG() 聚合函数 https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_json-arrayagg生成 JSON 对象数组(使用JSON_OBJECT() https://dev.mysql.com/doc/refman/8.0/en/json-creation-functions.html#function_json-object).

在连接内执行中间级别的分组,以生成sales每个用户的 JSON 数组。然后,结果将聚合到一行中,其中一列包含生成的对象 JSON 数组。

SELECT
  JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
FROM
    user u
    LEFT JOIN (
        SELECT 
            user, 
            JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales 
        FROM sale 
        GROUP BY user
    ) s ON s.user = u.id

如果将返回值包装为JSON_PRETTY,输出如下:

[
  {
    "id": 1,
    "name": "User 1",
    "sales": [
      {
        "id": 1,
        "item": "t-shirt"
      },
      {
        "id": 2,
        "item": "jeans"
      }
    ]
  },
  {
    "id": 2,
    "name": "User 2",
    "sales": [
      {
        "id": 3,
        "item": "sweatpants"
      },
      {
        "id": 4,
        "item": "gloves"
      }
    ]
  }
]

Edit:这是一个针对 MySQL "特点 :

SELECT
    CONCAT(
        '[', 
        GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' )  SEPARATOR ', ' ),
        ']'
    )
FROM 
    user u
    LEFT JOIN (
        SELECT 
            user, 
            CONCAT( 
               '[', 
                GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
                ']'
            ) sales 
    FROM sale
    GROUP BY user ) s ON s.user = u.id

DB Fiddle 上的演示 https://www.db-fiddle.com/f/eqSwXxhdvaKyW5VyrdpKii/0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 一对多转 JSON 格式 的相关文章

  • Python 中意外的缩进错误[重复]

    这个问题在这里已经有答案了 我有一段简单的代码 我不明白我的错误来自哪里 解析器在第 5 行 if 语句 上用意外的缩进向我咆哮 有人看到这里的问题吗 我不 def gen fibs a b 0 1 while True a b b a b
  • 这是在 python 中美白图像的正确方法吗?

    我在尝试着zero center and whiten CIFAR10数据集 但我得到的结果看起来像随机噪声 Cifar10数据集包含60 000尺寸的彩色图像32x32 训练集包含50 000和测试集包含10 000分别是图像 以下代码片
  • Python 有哪些重要的语言特性(习语)需要尽早学习[重复]

    这个问题在这里已经有答案了 我有兴趣了解 StackOverflow 社区认为 Python 的重要语言特性 习语 是什么 将程序员定义为 Pythonic 的特征 Python pythonic 习语 Python 语言自然的或特有的 代
  • tf.keras.utils.image_dataset_from_directory,但标签来自 csv?

    请告诉我哪里出错了 我正在研究 Kaggle 狗品种分类挑战 我想尝试 one hot 编码与标签编码 图像未在图像目录中拆分 因此我无法将 推断 与 tf keras utils image dataset from directory
  • Python pandas cumsum() 在达到最大值后重置

    我有一个 pandas DataFrame 其中 timedeltas 作为这些增量的累积和 在单独的列中以毫秒表示 下面提供了一个示例 Transaction ID Time TimeDelta CumSum ms 1 00 00 04
  • 在Python中修改大型文本文件最后一行的最有效方法

    我需要更新几个超过 2GB 的文件的最后一行 这些文件由无法读取的文本行组成readlines 目前 它可以通过逐行循环来正常工作 但是 我想知道是否有任何编译库可以更有效地实现这一点 谢谢 目前的方法 myfile open large
  • 用python计算网页大小

    我将如何使用 Python 计算网页 url 的大小 我尝试了 urllib2 并获取内容长度标头 但它不存在 import urllib2 url http www google com r urllib2 urlopen url Not
  • 将 Pandas 列转换为日期时间

    我在 pandas DataFrame 中有一个字段以字符串格式导入 它应该是一个日期时间变量 如何将其转换为日期时间列 然后根据日期进行过滤 Example raw data pd DataFrame Mycol 05SEP2014 00
  • 如何将 Java 字节数组转换为 Scala 字节数组?

    我是 Scala 新手 目前正在从事一个涉及 Java 和 Scala 模块的项目 现在我想使用 byte 类型的参数从 Java 调用 Scala 方法 Scala 方法的签名为 def foo data Array Byte Java
  • Pytest - 如何将参数传递给 setup_class?

    我有一些代码 如下所示 我得到了too few args当我运行它时出错 我没有打电话setup class明确地 所以不确定如何向它传递任何参数 我尝试用以下方法装饰该方法 classmethod 但仍然看到相同的错误 我看到的错误是这样
  • Java:如何复制对象数组?

    现在 我有一个 Point 对象数组 我想制作一个COPY该数组的 我尝试过以下方法 1 Point temp mypointarray 2 Point temp Point mypointarray clone 3 Point temp
  • hashlib 和 urandom 哪个更随机?

    我正在和一个朋友一起开发一个项目 我们需要生成随机哈希 在我们有时间讨论之前 我们都提出了不同的方法 并且因为他们使用不同的模块 我想问你们大家什么会更好 如果有这样的事情的话 hashlib sha1 str random random
  • 将 2D 数组中的每一列与另一个 2D 数组中的每一列相乘

    我有两个 Numpy 数组x有形状 m i and y有形状 m j 所以行数是相同的 我想将每一列相乘x每一列y逐元素 使结果具有形状 m i j Example import numpy as np np random seed 1 x
  • 如何对变量使用 GRANT?

    我在 MySql 中使用 GRANT 和变量时遇到一些麻烦 SET username user123 pass pass123 GRANT USAGE ON TO username IDENTIFIED BY pass GRANT INSE
  • 将内部联接和 where 子句添加到 INSERT INTO ON DUPLICATE KEY UPDATE

    我从 INSERT INTO ON DUPLICATE KEY UPDATE MySQL 语句开始 INSERT INTO Table1 field1 field2 VALUES 1 2 ON DUPLICATE KEY UPDATE fi
  • 在另一个数组的每隔一个元素之后插入一个数组中的元素(一次一个)(不均匀拉链)

    合并两个数组的优雅方法是什么 使得生成的数组具有第一个数组中的两个项目 后跟第二个数组中的单个项目 以这种方式重复 array1 A1 A2 A3 A4 A5 potentially longer array2 B1 B2 B3 B4 B5
  • 学院/大学数据 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试构建一个应用程序 允许用户查找特定大学并查看有关该大学的数据 录取率 SAT 分数 规模等 但
  • Python:从 apache authnz_ldap 获取用户

    我正在通过 Apache2 的 authnz ldap 模块成功验证 ldap 用户 我不清楚如何在他们登录后获取他们的用户名 以便我可以通过任何以下表单 网页与他们交互 我尝试过典型的方法 os getenv os environ get
  • Mac OS X 上的 Python 框架和非框架构建之间的差异

    Question Mac OS X 上的 Python 框架构建和非框架构建 即标准 UNIX 构建 之间有什么区别 另外 各自的优点和缺点是什么 初步研究 以下是我在发布此问题之前找到的信息 Pythonmac SIG Why is Fr
  • 使用按钮从 Django 项目根下载文件

    So this is the webpage I m creating atm with Django 1 8 希望用户能够将数据导出为 csv 当用户 在框中写下 Reddit 子版块名称 按下 获取数据 按钮 会发生什么 它创建了一个

随机推荐

  • 主机 LAN 上的 LXC 容器

    我的 LXC 容器通常与专用网络上的伪装桥配合使用 这次我想将容器放在主机的LAN上 但我无法得到任何结果 我在 debian 上使用 LXC 2 0 7 2 deb9u2 我参考了这个文档 LXC SimpleBridge https w
  • 用于停止表单提交的 JavaScript 代码

    停止表单提交的一种方法是从 JavaScript 函数返回 false 单击提交按钮时 将调用验证函数 我有一个表单验证的案例 如果满足该条件 我将调用一个名为的函数回到上一页 function returnToPreviousPage w
  • Google Developers Console:如何注册新应用程序?

    我正在努力追随本教程 https developers google com analytics solutions articles hello analytics api register project适用于 Google 的 Ana
  • npx create-next-app 命令不起作用 ENOENT 错误

    它显示了这个错误 我正在使用 npx 仍然显示使用纱线 当我将它用于反应应用程序时 npx 工作正常 它应该为我提供下一个应用程序启动器 临时修复可能是 npx create next app latest use npm 以便 creat
  • 如何使用 javascript 在 Whatsapp 上共享图像和文本

    你好 到目前为止 我可以使用 javascript 代码在 Whatsapp 上分享我的内容 但仍然无法分享带有文本的图像 有人做过吗 这是我的 JavaScript 代码 document ready function document
  • std::tr1::shared_ptr 是如何实现的?

    我一直在考虑使用共享指针 并且我知道如何自己实现一个 不想这样做 所以我正在尝试std tr1 shared ptr 我有几个问题 引用计数是如何实现的 它使用双向链表吗 顺便说一句 我已经用谷歌搜索过 但找不到任何可靠的东西 使用过程中有
  • 将命令行参数传递给已运行的应用程序实例

    我想将应用程序新实例的命令行参数传递给已经运行的应用程序 如果存在 到目前为止 我已经尝试了以下方法 程序 cs string Arguments Environment GetCommandLineArgs int iCurrentPro
  • 以编程方式将音乐文件访问到我的应用程序中

    如何以编程方式将设备中的音乐文件访问到我的应用程序中 另一种方法可能是使用 MediaStore 内容提供程序来查找您的音乐 http developer android com reference android provider Med
  • 如何查看大 JSON 对象是否包含值?

    我正在使用 PHP 对大量多维事件数组进行 json 编码 所以我得到如下内容 var ents 7 event id 7 nn The Whisky Drifters nn url the whisky drifters venue Th
  • 如何在 flutter 中重用有状态的 widget

    我有一个以下状态完整小部件 我需要通过更改两个变量来重用它id and collectionName 一般来说 我会提取一个小部件 但在这种情况下 我正在修改变量firstName 这不会让我提取小部件 class IndividualSi
  • 向量的循环移位(相当于numpy.roll)

    我有一个向量 a lt c 1 2 3 4 5 我想做一些类似的事情 b lt roll a 2 4 5 1 2 3 R中有类似的函数吗 我一直在谷歌上搜索 但 R Roll 主要给我提供有关西班牙语发音的页面 怎么样使用head and
  • WebStorm 没有本地存储的库

    我一直在开发一个完全可以在 jsfiddle net 上运行的项目 然而 当我尝试在 webStorm 中运行这个项目时 我收到两个错误 first second 之前 我在这里发布我的问题 我在 stackoverflow 上搜索但找不到
  • C++ 模板特化/重载

    首先 我对这个问题的模糊标题感到抱歉 我不知道如何总结它 我想要实现的目标如下 我希望能够将不同类型的模板非类型参数传递给同一个类模板 从而产生不同的实例化 像这样的事情 Foo lt 1 gt Foo lt 1 gt different
  • 是否可以在不使用清单的情况下设置 Powershell 模块名称/版本?

    我可以看到 如果没有清单 默认模块名称将设置为 psm1 文件名 但是有没有办法在模块代码中设置它 我也想在代码中设置版本 如果您要导入二进制模块 则将从程序集元数据中提取模块版本 然而 该名称只是 DLL 的文件名 对于脚本模块 psm1
  • 尝试在整数后添加字符然后打印结果时出现奇怪的结果

    我正在尝试创建一个简单的欧姆定律计算器 所以我们的想法是你可以填写两个变量 然后它会计算第三个变量 当我创建这个程序时 我发现了一个小问题 我不明白它是如何发生的 不幸的是我无法找到答案 我尝试打印一个显示完整计算的字符串 用户填写的两个变
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • WCF OperationContract 方法的 WebGet 属性可以有多个 ResponseFormat 类型吗?

    我有一个 ServiceContract 描述 WCF 服务中使用的方法 该方法具有定义 UriTemplate 和 ResponseFormat 的 WebGet 属性 我想重用单个方法并拥有多个具有不同 UriTemplate 和不同
  • 将正则表达式拆分为 2 个捕获组

    好吧 我之前的问题都得到解答了 我还有一个 这个对我来说比较难 A Za z A Za z0 9 domain com 现在这个表达式只产生 1 个捕获组 如 所示 我该如何为此 URL 执行 2 个捕获组 用于IIS正则表达式重写 您可以
  • 通过wget命令爬取sitemap.xml的链接

    我尝试抓取 sitemap xml 的所有链接以重新缓存网站 但是 wget 的递归选项不起作用 我只得到响应 远程文件存在 但不包含任何链接 无法检索 但可以肯定的是 sitemap xml 充满了 http 链接 我尝试了 wget 的
  • MySQL 一对多转 JSON 格式

    我有两个 MySQL 表 User id name Sale id user item Where Sale user 是一个外键User id 所以这是一种一对多的关系 一个用户可以进行多次销售 我试图从数据库中获取它并以 JSON 格式