我正在为个人项目进行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]
答案 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对象。