将 JavaScript 数组中的 sqlite 左连接行合并"redundant" JSON



我正在为我的网站创建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;

最新更新