2 回答
TA贡献1871条经验 获得超8个赞
您可以利用 MySQL 的 JSON 函数直接从数据库生成嵌套 JSON 结构。
考虑:
SELECT
id,
userId,
effortDate,
createdAt,
updatedAt,
(
SELECT JSON_ARRAYAGG(
JSON_OBJECT('projectId', ed.projectId, 'value', ed.value)
)
FROM efforts_data ed
WHERE ed.effortId = e.id
) AS data
FROM efforts
这为您提供了每行一行efforts,其中有一列名为data,其中包含由 table 中的对象数组组成的 JSON 有效负载efforts_data。
如果您想要的话,您可以向前一步将每一行填充到一个对象中:
SELECT JSON_OBJECT(
'id', id,
'userId', userId,
'effortDate', effortDate,
'createdAt', createdAt,
'updatedAt', updatedAt,
'data', (
SELECT JSON_ARRAYAGG(
JSON_OBJECT('projectId', ed.projectId, 'value', ed.value)
)
FROM efforts_data ed
WHERE ed.effortId = e.id
)
) res
FROM efforts
在 MySQL < 5.7.22 或 MariaDB < 10.5.0 中JSON_ARRAYAGG()尚不可用,一种解决方法是GROUP_CONCAT()字符串连接。基本上你会重写这个:
SELECT JSON_ARRAYAGG(
JSON_OBJECT('projectId', ed.projectId, 'value', ed.value)
)
FROM efforts_data ed
WHERE ed.effortId = e.id
作为:
SELECT CONCAT(
'[',
GROUP_CONCAT(JSON_OBJECT('projectId', ed.projectId, 'value', ed.value)),
']'
)
FROM efforts_data ed
WHERE ed.effortId = e.id
TA贡献1853条经验 获得超18个赞
我的问题是:有什么办法只使用 SQL 来做到这一点吗?
efforts id是的,这就是为什么和之间存在关系efforts_data effortId:
SELECT e.id, e.userId, e.effortDate, e.createdAt, e.updatedAt,
ed.id, ed.effortId, ed.projectId, ed.value
FROM efforts AS e, efforts_data AS ed
WHERE e.id = ed.effortId
- 2 回答
- 0 关注
- 96 浏览
添加回答
举报