通过SQL联接获取类似数组的数据以形成完整的对象

时间:2018-11-11 21:08:19

标签: sql postgresql node-postgres

我有以下三个表:

drinks: id | name

ingredient: id | name

drink_ingredients: drinks.id | ingredients.id

当我创建“饮料”时,我也会提供一系列成分ID。这里的关系由drink_ingredients表管理,这使我可以重复使用配料。

我正在尝试创建一个查询,该查询将返回表示以下内容的数据:

drink { id: 0 | name: 'Coffee' | ingredients: [2, 3] }

从本质上讲,我想提取此饮料附带的成分ID,并将其作为数组返回。

我目前有

select * from "drinks" inner join "drink_ingredients" on "drinks"."id" = "drink_ingredients"."drink_id"

我仍然缺少从ingredients检索数据的步骤,但这同样会返回:

  {
    "id": 0,
    "owner": 18,
    "name": "Coffee",
    "drink_id": 0,
    "ingredient_id": 2
  },
  {
    "id": 0,
    "owner": 18,
    "name": "Coffee",
    "drink_id": 0,
    "ingredient_id": 3
  },

是否可以通过这种方式在单个语句中正确嵌入数据?

1 个答案:

答案 0 :(得分:1)

这可以使用array_agg函数来完成:

select d.id, d.name, array_agg(di.ingredient_id) as ingredients
from drinks d
  left outer join drink_ingredients di on di.drink_id = d.id
group by d.id, d.name

由于您(按您的问题)仅需要成分ID数组,因此您甚至不需要加入成分。左连接是为了防止您喝没有成分的饮料(水?)。