我有以下三个表:
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
},
是否可以通过这种方式在单个语句中正确嵌入数据?
答案 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数组,因此您甚至不需要加入成分。左连接是为了防止您喝没有成分的饮料(水?)。