Return 连接行的列作为数组而不是对象

Return column of joined rows as array instead of object

我遇到了一个有点难以解释的问题。

我有两个数据库表:

ID FRUIT
1 Apple
2 Orange
FRUIT_ID COLOR
1 Red
1 Green
2 Orange

背后的想法:一个水果可以有多种颜色。 要获得所有水果的所有颜色,我必须加入它们:

SELECT a.*, b.color FROM 水果 a, FruitColor b 其中 a.id = b.fruit_id

ID FRUIT COLOR
1 Apple Red
1 Apple Green
2 Orange Orange

JSON 看起来像这样:

[
  {
    "ID": "1",
    "FRUIT": "Apple",
    "COLOR": "Red"
  },
  {
    "ID": "1",
    "FRUIT": "Apple",
    "COLOR": "GREEN"
  },
  {
    "ID": "2",
    "FRUIT": "Orange",
    "COLOR": "Orange"
  }
]

问题来了 我实际上不想 return 每个额外颜色的对象,我需要将它们放在这样的数组中:

[
  {
    "ID": "1",
    "FRUIT": "Apple",
    "COLOR": [
      "Red",
      "Green"
    ]
  },
  {
    "ID": "2",
    "FRUIT": "Orange",
    "COLOR": "Orange"
  }
]

我怎样才能做到这一点? 如果我必须更改数据库结构或查询并不重要,对此的任何解决方案都会有所帮助。

你可以使用JSON_ARRAYAGG函数两次,以便第一次封装颜色,第二次应用的对象如

SELECT JSON_ARRAYAGG(js) AS Result
  FROM (SELECT JSON_OBJECT('id',
                           f.id,
                           'fruit',
                           f.fruit,
                           'state',
                           JSON_ARRAYAGG(fc.color)) AS js
          FROM Fruit AS f
          JOIN FruitColor AS fc
            ON f.id = fc.fruit_id
         GROUP BY f.id, f.fruit) j

Demo