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

标签 php mysql sql arrays json

我的 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 查询应该是什么,以便它输出 1 个平面表,可以轻松转换为 JSON(在 PHP 或 JavaScript/jQuery 中)?

我的处理方式是否正确?

最佳答案

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

首先,考虑 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 表以查找子记录,并使用aggregate 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

产量:

| 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"}]} |

Demo on DB Fiddle

关于php - 如何 SQL 查询特定 JSON 格式的父子关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211880/

相关文章:

php - 使用 PHP 删除 mysql 用户

php - 如何使用foreach从数据库表中获取数据——

php - WAMP Mysqli 不工作而 Mysql 工作

sql - 在右表上以特殊条件左连接

php - 如何防止 PHP 中的 SQL 注入(inject)?

sql - 在同一列上有 FK 和 PK?基数/SQL

php - strripos 允许的内存大小 134217728 字节已耗尽(尝试分配 58887728 字节)

php - NuSoap soapClient 调用出现 "Premature end of data in tag html"错误

mysql - 自动 Access DB5到MySQL

mysql - Sails JS - 动态连接到 MySQL 数据库