【问题标题】:Building json document in mysql with multiple tables in hierarchic structure?在 mysql 中使用分层结构的多个表构建 json 文档?
【发布时间】:2022-10-25 04:08:03
【问题描述】:

假设你有一张像这样的桌子:

CREATE TABLE Users (
    id INT(10) NOT NULL,
    first_name VARCHAR(45) NOT NULL,
    PRIMARY KEY (`id`)
);

还有一个像:

CREATE TABLE Pets (
    id INT(10) NOT NULL,
    name VARCHAR(45) NOT NULL,
    owner_id INT(10) NOT NULL
    PRIMARY KEY (`id`),
    CONSTRAINT `fk_owner` FOREIGN KEY (`owner_id`) REFERENCES `Users` (`id`)
);

我希望能够运行将返回的查询:

[
    {
       "id": 1,
       "first_name":"bob",
       "pets" : [
              {
                  "id":3,
                  "name":"Kitty"
              },
              {
                  "id":4,
                  "name":"Doggy"
              }
        ]
     },
....

]

现在,在我们的服务器中,我们分别查询每个表,获取结果,然后构建要返回的结构。这似乎很昂贵,因为它需要多次调用数据库,并确保每个查询的“WHERE”子句相同。例如,获取所有名字为 Frank 的用户以及他们所有的宠物的查询将是这两个:

SELECT u.id, u.first_name
FROM Users u
WHERE u.first_name LIKE 'Frank%'

SELECT p.id, p.name
FROM Pets p
WHERE p.owner_id IN (SELECT u.id FROM Users u u.first_name LIKE 'Frank%')

然后我们必须将结果保存在内存中以生成最终的 JSON。

似乎在 mysql 8.x 中可以访问 JSON 函数,应该有更好的方法来做到这一点。有什么想法吗?

【问题讨论】:

  • 你试过什么?你说你知道 MySQL 8.0 中有 JSON 函数。您是否阅读了描述这些功能的手册条目?你试过了吗?
  • 您需要 2 个聚合级别(根据所需的输出)/因此 CTE 中的聚合和外部查询中的下一个。 JSON_ARRAYAGG(JSON_OBJECT(...))
  • @BillKarwin - 我没有看到任何明显处理层次结构的 JSON 函数。

标签: mysql json


【解决方案1】:

以下是我编写查询以对 JSON 格式进行类似聚合的方式:

SELECT JSON_ARRAYAGG(
  JSON_OBJECT(
    'id', t.id,
    'name', t.first_name,
    'pets', t.pets
  )
) AS result
FROM (
    SELECT u.id, u.first_name JSON_ARRAYAGG(
        JSON_OBJECT(
          'id', p.id,
          ''name', p.name'
        )
      ) AS pets
    FROM Users AS u
    LEFT OUTER JOIN Pets AS p ON u.id = p.owner_id 
    WHERE u.first_name LIKE 'Frank%'
    GROUP BY u.id
) AS t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多