Захват массивоподобных данных через SQL-соединения для формирования законченного объекта - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть следующие три таблицы:

drinks: id | name

ingredient: id | name

drink_ingredients: drinks.id | ingredients.id

Когда я создаю «напиток», я также предоставляю множество идентификаторов ингредиентов. Здесь отношения управляются таблицей drink_ingredients, которая позволяет мне повторно использовать ингредиенты.

Я пытаюсь создать запрос, который будет возвращать данные, представляющие следующее:

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

По сути, я хотел бы извлечь идентификатор ингредиента, прикрепленный к этому напитку, и вернуть их в виде массива.

У меня сейчас

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 голосов
/ 12 ноября 2018

Это можно сделать с помощью функции 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

Поскольку вам (по вашему вопросу) нужен только набор идентификаторов ингредиентов, вам даже не нужно объединяться с ингредиентами. Левое соединение - на тот случай, если вы пьете без ингредиентов (вода?).

...