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

Grabbing array-like data via SQL joins to form complete object

我有以下三个table:

drinks: id | name

ingredient: id | name

drink_ingredients: drinks.id | ingredients.id

当我创建 "drink" 时,我还提供了一组成分 ID。这里的关系由 drink_ingredients table 管理,这允许我重复使用成分。

我正在尝试创建一个查询,其中 return 数据表示以下内容:

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

本质上意味着我想提取出这种饮料附带的成分 ID,并将它们 return 作为一个数组。

我目前有

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

我仍然缺少从 ingredients 检索数据的步骤,但是这个 returns:

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

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

这可以使用 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 数组,您甚至不需要加入配料。左边的连接是为了以防万一你喝了没有配料(水?)的饮料。