GROUP_CONCAT以多对多关系返回对象数组

时间:2019-10-05 06:10:59

标签: mysql json many-to-many

我正在为个人项目进行mySQL查询。现在,最终目标是让查询为每个项目返回以下json:

{
    "id": 1,
    "designName": "Slender Man",
    "designNotes": "Rewrite the lapel component",
    "quantity": 3,
    "colors": [
        {
        "id": 4,
        "colorName": "black",
        "colorSwatch": "rgb (0,0,0)",
        "brandName": "caron simply soft",
        "yarnWeightId": {
              "weightNumber": 4,
              "weightName": "medium/worst weight"
          }
        },{
        "id": 5,
        "colorName": "Off White",
        "colorSwatch": "rgb (255,255,255)",
        "brandName": "caron simply soft",
        "yarnWeightId": {
              "weightNumber": 4,
              "weightName": "medium/worst weight"
          }
        }
    ]
}

我最近的尝试是:

SELECT 
    d.id,
    d.designName,
    d.designNotes,
    d.quantity,
    d.isDeleted,
    GROUP_CONCAT(
        JSON_OBJECT(
            c.colorName,
            c.colorSwatch,
            c.brandName,
            yw.weightNumber,
            yw.weightName
        )
    ) AS colorsUsed
FROM designs AS d
    INNER JOIN design_colors AS dc 
        ON dc.designId = d.id
    INNER JOIN colors AS c 
        ON dc.colorId = c.id
    INNER JOIN yarnweights AS yw 
        ON c.yarnWeightId = yw.id
GROUP BY d.id
;

这给我一个内部服务器错误。使用更简单的查询进行测试可以正常进行,因此我将其范围缩小到查询本身就是问题所在。

以下查询使我关闭:

SELECT 
    d.id,
    d.designName,
    d.designNotes,
    d.quantity,
    d.isDeleted,
    GROUP_CONCAT(
        DISTINCT c.id
        GROUP BY c.id
    ) AS colorsUsed
FROM designs AS d
    INNER JOIN design_colors AS dc 
        ON dc.designId = d.id
    INNER JOIN colors AS c 
        ON dc.colorId = c.id
    INNER JOIN yarnweights AS yw 
        ON c.yarnWeightId = yw.id
GROUP BY
    d.id

它返回了这样的对象:

{
    "id": 3,
    "designName": "Slenderman",
    "designNotes": null,
    "quantity": 0,
    "isDeleted": 0,
    "colorsUsed": "4,5"
}

但是当我获得所有colorsUsed的ID时,我没有将它们放在数组中,更不用说在那里需要的对象数组了。我觉得GROUP_CONCAT不是正确的解决方案,或者至少我没有正确使用它,但这就是我一直在寻找解决方案时出现的问题。保持正确方向的正确点也将有所帮助。


我的数据库的结构如下: [db图表] [https://i.stack.imgur.com/lxsvv.png]

1 个答案:

答案 0 :(得分:0)

您可以使用MySQL JSON函数生成有效的JSON对象,而不是使用/* applies to the second line */ div.fixed_site layer_wrapper + div.fixed_site layer_wrapper squarebox {} 之类的字符串连接函数。 GROUP_CONCAT()可用于创建对象,JSON_OBJECT()是可生成JSON数组的聚合函数。

首先,让我们从返回所有所需列的查询开始:

JSON_ARRAYAGG()

现在我们可以使用JSON函数打开聚合以生成预期的结果集:

SELECT 
    d.id,
    d.designName,
    d.designNotes,
    d.quantity,
    c.id,
    c.colorName,
    c.colorSwatch,
    c.brandName
    y.weightNumber,
    y.weightName
FROM 
    designs AS d
    INNER JOIN design_colors AS dc ON dc.designId = d.id
    INNER JOIN colors AS c ON dc.colorId = c.id
    INNER JOIN yarnweights AS y ON c.yarnWeightId = y.id

这将返回一个具有唯一列的结果集,其中每个记录都包含预期的JSON对象。