如何通过 SQL 查询特定 JSON 格式的父子关系?

2024-01-02

我希望我的 jQuery 代码有这个 JSON:

{
  "projects": [
    {
      "id": "1",
      "project_name": "Carmichael House",
      "parent_id": "0",
      "children": [
        {
          "id": "2",
          "project_name": "Carmichael Kitchen",
          "parent_id": "1"
        },
        {
          "id": "3",
          "project_name": "Carmichael Bathroom",
          "parent_id": "1"
        }
      ]
    },
    {
      "id": "2",
      "project_name": "Dowd Apartment",
      "parent_id": "0",
      "children": [
        {
          "id": "4",
          "project_name": "Dowd Kitchen",
          "parent_id": "2"
        }
      ]
    }
  ]
}

该数据将来自 MySql 表tbl_projects:

id
project_name
parent_id

SQL应该是什么SELECT查询be,这样就会输出1张平桌,可以轻松转换为 JSON(在 PHP 或 JavaScript/jQuery 中)?

我是否以正确的方式处理这个问题?


您可以直接从 MySQL 生成 JSON 内容。这是一个适用于 MySQL 5.7 或更高版本的解决方案。

作为初学者,请考虑功能JSON_OBJECT() https://dev.mysql.com/doc/refman/8.0/en/json-creation-functions.html#function_json-object,为表中的每条记录生成一个 JSON 对象:

SELECT 
    p.*, 
    JSON_OBJECT('id', id, 'project_name', project_name, 'parent_id', parent_id) js
FROM tbl_projects p;

给定您的样本数据,这将返回:

| id  | project_name        | parent_id | js                                                               |
| --- | ------------------- | --------- | ---------------------------------------------------------------- |
| 1   | Carmichael House    | 0         | {"id": 1, "parent_id": 0, "project_name": "Carmichael House"}    |
| 2   | Carmichael Kitchen  | 1         | {"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}  |
| 3   | Carmichael Bathroom | 1         | {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"} |
| 4   | Dowd Apartment      | 0         | {"id": 4, "parent_id": 0, "project_name": "Dowd Apartment"}      |
| 5   | Dowd Kitchen        | 4         | {"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}        |

为了产生您预期的输出,我们将自行JOIN表查找子记录,并使用聚合函数JSON_ARRAYAGG() https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_json-arrayagg生成内部 JSON 数组。额外的聚合级别将所有内容填充到单个对象中。如示例数据所示,我假设根项目有parent_id = 0并且只有一层层次结构:

SELECT JSON_OBJECT('projects', JSON_ARRAYAGG(js)) results
FROM (
    SELECT JSON_OBJECT(
        'id', p.id, 
        'project_name', p.project_name, 
        'parent_id', p.parent_id,
        'children', JSON_ARRAYAGG(
            JSON_OBJECT(
                'id', p1.id, 
                'project_name', p1.project_name, 
                'parent_id', p1.parent_id
            )
        )
    ) js
    FROM tbl_projects p
    LEFT JOIN tbl_projects p1 ON p.id = p1.parent_id
    WHERE p.parent_id = 0
    GROUP BY p.id, p.project_name, p.parent_id
) x

Yields:

| results                                                                                                                                                                                                                                                                                                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| {"projects": [{"id": 1, "children": [{"id": 2, "parent_id": 1, "project_name": "Carmichael Kitchen"}, {"id": 3, "parent_id": 1, "project_name": "Carmichael Bathroom"}], "parent_id": 0, "project_name": "Carmichael House"}, {"id": 4, "children": [{"id": 5, "parent_id": 4, "project_name": "Dowd Kitchen"}], "parent_id": 0, "project_name": "Dowd Apartment"}]} |

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

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

如何通过 SQL 查询特定 JSON 格式的父子关系? 的相关文章

  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 从数组中删除空白元素

    当我从 ruby on Rails 表单中保存多个选择时 它似乎在前面添加了一个空白元素 我该如何删除它 该字段为 selected player utf8 gt authenticity token gt H8W7qPBezubyeU0a
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • MySQL 追加字符串

    How can I append a string to the end of an existing table value Let s say I have the table below And let s say that Mari
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • 如何在 Laravel 中使用 PUT http 动词提交表单

    我知道这个问题可能已经提出 但我就是无法让它发挥作用 如果有人可以帮助我 我将非常感激 我安装了 colletive form 但答案也可以是 html 表单标签 现在列出我的表格 我的路线和我的例外情况 Form model array
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • 在 Android 应用程序资源中使用 JSON 文件

    假设我的应用程序的原始资源文件夹中有一个包含 JSON 内容的文件 我如何将其读入应用程序 以便我可以解析 JSON See 开放原始资源 http developer android com reference android conte
  • Magento - 自定义支付模块

    这是一个非常普遍的问题 但这里是 我正在尝试在 Magento 中创建一个自定义支付模块 我创建了一个 常规 模块 可以连接到 Magento 事件 观察者模型 但是我如何告诉 Magento 将模块视为支付模块 以便它显示在管理后端和结账
  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a

随机推荐

  • 带有关闭按钮的 Angular UI Bootstrap 弹出框

    我正在使用 Angular UI Bootstrap 创建弹出窗口 但我找不到在弹出窗口内添加关闭按钮的选项 我自定义了弹出框模板以包含关闭按钮 但我仍然无法找到关闭弹出窗口的函数 事件 环境isOpenfalse 第一次起作用 因为它只是
  • 如何在 PHP-CS-Fixer 中配置 HeaderCommentFixer

    我想用HeaderCommentFixer https github com FriendsOfPHP PHP CS Fixer blob 1 12 Symfony CS Fixer Contrib HeaderCommentFixer p
  • 将 Github 页面重定向到自定义域

    我创建了一个 Github Pages 站点 并将其放在 github 帐户的存储库 abc 上 用户名为 xyz 所以 我的网站现在位于 xyz github io abc 我使用自定义域创建了一个 cname 文件 并使用 Github
  • ClojureScript:如何通过原型向 JS 对象添加方法?

    我正在尝试向现有的 JavaScript 系统添加一些功能 然后再次从 JavaScript 使用 而不是在 ClojureScript 命名空间内 也许这是不可能的 这是我想做的事情的简化 JavaScript String protot
  • 无法使用 Express.js 更改 Favicon

    这是一个非常基本的问题 但我正在尝试使用以下命令更改我的 node js Express 应用程序的图标 app use express favicon dirname public images favicon ico 我仍然得到默认的图
  • 为什么不让每个节点都成为种子节点

    我是卡桑德拉新手 我了解种子节点的用途 但是种子节点有任何相关成本吗 如果是这样 它们是什么 另外 我想知道为什么不让每个节点都成为种子节点 作为种子 基本上没有本地运行时成本 除了您可能会比非种子节点收到更多的八卦流量之外 然而 随着种子
  • 如何通过进程生成器在 4-5 秒后停止执行命令?

    参考代码 ProcessBuilder ps4 Process pr4 null String batchFile3 new File path src example sh ps4 new ProcessBuilder batchFile
  • PyQt:使用不同的 ItemIgnoresTransformations 标志移动多个项目

    有时选定的项目不会一起移动 这种情况发生在具有两种类型项目的应用程序中 常规物品 处理 与ItemIgnoresTransformations标志 缩放时它们必须保持相同的大小 当它们一起被选择并用鼠标移动时 它们预计会被平移相同的量 它们
  • 有没有办法使用 CSS 使子 DIV 的宽度比父 DIV 宽?

    有没有办法让父容器 DIV 中的子 DIV 比其父容器宽 子 DIV 需要与浏览器视口的宽度相同 See example below 子DIVmust保留为父 div 的子级 我知道我可以在子 div 上设置任意负边距以使其更宽 但我无法弄
  • 必须在我的 Rails 3 应用程序的控制器操作中显式渲染 :layout => 'application'

    我必须在控制器操作中显式渲染 layout gt application 才能让我的新 Rails 3 应用程序实际使用 application html erb 布局文件 有什么明显的事情可以看出我做错了吗 如果我不调用 layout 选
  • 使用 Keras,如何输入 X_train 图像(超过一千张图像)?

    我的应用程序是使用机器学习 卷积神经网络 的事故避免汽车系统 我的图像是 200x100 JPG 图像 输出是 4 个元素的数组 汽车将向左 向右 停止或前进 所以输出将让一个元素成为1 根据应采取的正确行动 和其他 3 个要素将是0 我现
  • JavaScript 数组到 CSV

    我关注了这个帖子如何将 JavaScript 数组信息导出到 csv 在客户端 https stackoverflow com questions 14964035 how to export javascript array info t
  • 模型内的简单验证规则

    我在这里提到Laravel 4 2 验证规则 当前密码必须与数据库值匹配 https stackoverflow com questions 24830119 laravel 4 2 validation rules current pas
  • 根据父级 div 大小按比例调整图像大小

    我正在使用全浏览器宽度高度 jquery blockUI 来显示从图库中选择的图像 下图是 blockUI 中的视图方案 基本上侧块 UI 中的视图的宽度和高度设置为 100 里面还有两个 div 右侧的宽度设置为视图的 80 并且包含图像
  • 以编程方式更改“默认使用此操作”

    我有普通的 电话 拨号器和新的 拨号器 应用程序 现在 如果我选中 默认情况下使用此操作 并单击 拨号器 应用程序 那么每次按下电话按钮时 拨号器 应用程序都会自动启动 但我怎样才能在代码中改变它呢 此首选项存储在哪里 这是如何映射的 这是
  • 计算椭圆尺寸与距中心点距离的关系

    我想在每次崩溃时实现尺寸的缓慢消失 换句话说 当圆最大时 椭圆的尺寸也最大 反之 收缩时则相反 到目前为止 我试图通过从中心点的距离重新映射 cSize 来实现这种影响 但在此过程中的某个地方出了问题 目前 我的椭圆尺寸正在从小到大的缓慢过
  • 通过正则表达式获取模式的不匹配部分

    在本主题中 想法是 剥离 数字 除以x通过正则表达式 gt 如何使用 Excel 正则表达式从字符串中提取广告尺寸 https stackoverflow com questions 48427343 how to extract ad s
  • 在 Windows 7 中使用 .NET Windows 服务显示消息框

    在 Windows 7 中使用 NET Windows 服务显示消息框 我们有一个 Windows 服务 用于在用户在 Windows XP 上扫描访问卡后显示确认消息框 但一旦我们迁移到 Windows 7 该弹出功能就不再起作用 正如这
  • XSL 显示属性名称

    所以 用那个
  • 如何通过 SQL 查询特定 JSON 格式的父子关系?

    我希望我的 jQuery 代码有这个 JSON projects id 1 project name Carmichael House parent id 0 children id 2 project name Carmichael Ki