2 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以利用 MySQL 的 JSON 函數(shù)直接從數(shù)據(jù)庫生成嵌套 JSON 結(jié)構(gòu)。
考慮:
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 中的對象數(shù)組組成的 JSON 有效負(fù)載efforts_data。
如果您想要的話,您可以向前一步將每一行填充到一個(gè)對象中:
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()字符串連接。基本上你會重寫這個(gè):
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貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
我的問題是:有什么辦法只使用 SQL 來做到這一點(diǎn)嗎?
efforts id是的,這就是為什么和之間存在關(guān)系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 關(guān)注
- 135 瀏覽
添加回答
舉報(bào)