【发布时间】: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 函数。