这是一个可能满足您要求的 SQL 查询。它使用MySQL JSON_ARRAYAGG() 聚合函数 https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_json-arrayagg生成 JSON 对象数组(使用JSON_OBJECT() https://dev.mysql.com/doc/refman/8.0/en/json-creation-functions.html#function_json-object).
在连接内执行中间级别的分组,以生成sales
每个用户的 JSON 数组。然后,结果将聚合到一行中,其中一列包含生成的对象 JSON 数组。
SELECT
JSON_ARRAYAGG(JSON_OBJECT('id', u.id, 'name', u.name, 'sales', s.sales))
FROM
user u
LEFT JOIN (
SELECT
user,
JSON_ARRAYAGG(JSON_OBJECT('id', id, 'item', item)) sales
FROM sale
GROUP BY user
) s ON s.user = u.id
如果将返回值包装为JSON_PRETTY
,输出如下:
[
{
"id": 1,
"name": "User 1",
"sales": [
{
"id": 1,
"item": "t-shirt"
},
{
"id": 2,
"item": "jeans"
}
]
},
{
"id": 2,
"name": "User 2",
"sales": [
{
"id": 3,
"item": "sweatpants"
},
{
"id": 4,
"item": "gloves"
}
]
}
]
Edit:这是一个针对 MySQL "特点 :
SELECT
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', u.id, ', "name":"', u.name, '", "sales":', s.sales, ' }' ) SEPARATOR ', ' ),
']'
)
FROM
user u
LEFT JOIN (
SELECT
user,
CONCAT(
'[',
GROUP_CONCAT( CONCAT( '{ "id":', id, ', "item":"', item, '" }' ) SEPARATOR ', '),
']'
) sales
FROM sale
GROUP BY user ) s ON s.user = u.id
DB Fiddle 上的演示 https://www.db-fiddle.com/f/eqSwXxhdvaKyW5VyrdpKii/0