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