【问题标题】:Generate JSON output with MySQL使用 MySQL 生成 JSON 输出
【发布时间】:2021-08-03 23:01:53
【问题描述】:

我有 2 张桌子,其中:

表 1:名称

| id | first_name | last_name |
|----|------------|-----------|
| 1  | John       | Doe       |
| 2  | Jane       | Doe       |

表 2:电话

| rec | id |  type  |    number    |
|-----|----|--------|--------------|
| 1   | 1  | Home   | 123-123-1234 |
| 2   | 1  | Work   | 234-234-2345 |
| 3   | 1  | Mobile | 345-345-3456 |
| 4   | 2  | Mobile | 456-456-4567 |

如果我运行以下查询:

SELECT name.*, phone.type, phone.number
FROM name, phone
WHERE name.id = phone.id

会产生如下结果:

| id | first_name | last_name |  type  |    number    |
|----|------------|-----------|--------|--------------|
| 1  | John       | Doe       | Home   | 123-123-1234 |
| 1  | John       | Doe       | Work   | 234-234-2345 |
| 1  | John       | Doe       | Mobile | 345-345-3456 |
| 2  | Jane       | Doe       | Mobile | 456-456-4567 |

有没有办法将查询输出生成为 JSON,使其看起来像这样:

{
    "data": [{
        "id": 1,
        "first_name": "John",
        "last_name": "Doe",
        "phone": [{
                "type": "Home",
                "number": "123-123-1234"
            },
            {
                "type": "Work",
                "number": "234-234-2345"
            },
            {
                "type": "Mobile",
                "number": "345-345-3456"
            }
        ]
    }, {
        "id": 2,
        "first_name": "Jane",
        "last_name": "Doe",
        "phone": [{
            "type": "Mobile",
            "number": "456-456-4567"
        }]
    }]
}

【问题讨论】:

标签: mysql json mysql-8.0


【解决方案1】:

您可以使用以下内容并查看下面的工作小提琴:


SELECT JSON_OBJECT(
   "data",JSON_ARRAYAGG(results)
) as final_result
FROM (
    SELECT 
        JSON_OBJECT(
          "id",name.id,
          "first_name",name.first_name,
          "last_name",name.last_name,
          "phone",JSON_ARRAYAGG(
               JSON_OBJECT(
                  "type",phone.type,
                  "number",phone.number
               )
          )
        ) as results
    FROM name
    INNER JOIN phone ON phone.id = name.id
    GROUP BY name.id,first_name,last_name
 ) t




final_result
{"data": [{"id": 1, "phone": [{"type": "Home", "number": "123-123-1234"}, {"type": "Work", "number": "234-234-2345"}, {"type": "Mobile", "number": "345-345-3456"}], "last_name": "Doe", "first_name": "John"}, {"id": 2, "phone": [{"type": "Mobile", "number": "456-456-4567"}], "last_name": "Doe", "first_name": "Jane"}]}

View on DB Fiddle

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2013-09-09
    • 2014-03-20
    相关资源
    最近更新 更多