我正在为我的网站创建expressjs的REST API,目前我有一个Product
表如下:
id | name
1 | Shirt
产品可能有已知缺陷,列在单独的表Flaw
id | desc | productId
1 | short sleeve | 1
2 | no buttons | 1
在我的前端,我想列出该产品的所有缺陷,所以我需要一个JSON如下:
[{"id": 1, "name": "Shirt", "flaws": [{"desc": "short sleeve"}, {"desc": "no buttons"}]}]
目前,我的SQL查询在express看起来像这样:
var sql = "SELECT Product.id, Product.name, Flaw.desc FROM Product LEFT JOIN Flaw ON Flaw.productId = Product.id"
,这就是我如何进行调用并将其获取到JSON:
db.all(sql, (err, rows) => {
if(err){
res.status(400).json({"error": err.message});
}
res.status(200).json(rows);
});
然而,这导致了以下结果:
[{"id": 1, "name": "Shirt", "desc": "short sleeve"}, {"id": 1, "name": "Shirt", "desc": "no buttons"}]
我知道这是由于我的SQL查询的性质(使用左连接),但我想知道一个好方法的"合并"将冗余部分合并为一个条目(id、name),并拥有"子对";在我的JSON中被称为缺陷,其中列出了非冗余的缺陷部分。
直接从查询中获取json:
SELECT json_object(
'id', p.id,
'name', p.name,
'flaws', json_group_array(json_object('desc', f.desc))
) result
FROM Product p LEFT JOIN Flaw f
ON f.productId = p.id
GROUP BY p.id;