PostgreSQL: объединить 2 таблицы на основе столбца массива (внешнего ключа) - PullRequest
0 голосов
/ 09 июня 2018

Я использую PostgreSQL, и у меня есть таблица, в которой я храню своих пользователей, а в другой таблице я храню группу пользователей, которая содержит идентификатор и имя группы.В таблице пользователя у меня есть столбец, в котором я сохраняю идентификатор группы каждого пользователя в массиве.Теперь я хочу получить все данные от пользователей и названия групп для каждого пользователя.Как я должен это делать?Вот пример: таблица пользователя:

user_id  name  roles   
1        bob   [1, 2]   
2        jack  [3]

таблица ролей:

role_id  name
 1       ceo
 2       cto
 3       financial

, и я ожидаю, что:

user_id  name   role_name
 1       bob    CEO, cto
 2       jack   financial

1 Ответ

0 голосов
/ 09 июня 2018

Как сказал пользователь LJ01 в комментариях, вам следует объединить 2 таблицы.Если таблицы пользователей и групп имеют следующую структуру:

CREATE TABLE users (
  id BIGINT,
  name TEXT,
  group_ids BIGINT[]
);

CREATE TABLE groups (
  id BIGINT,
  name TEXT
);

Вы можете объединить таблицы с помощью следующего запроса:

SELECT u.*,g.name FROM users u JOIN groups g ON g.id = ANY (u.group_ids);

То есть, если таблица пользователейимеет следующие данные:

id  name    group_ids
1   Test1   {1,2,3}
2   Test2   {3,4}

И есть 4 группы:

id  name
1   Group1
2   Group2
3   Group3
4   Group4

Результат запроса будет

1   Test1   {1,2,3} Group1
1   Test1   {1,2,3} Group2
1   Test1   {1,2,3} Group3
2   Test2   {3,4}   Group3
2   Test2   {3,4}   Group4

ОБНОВЛЕНИЕ Пользователь запросил одну строку для каждого пользователя с группами, объединенными в одну строку.Это может быть достигнуто с помощью следующего запроса:

  SELECT u.id, u.name,array_agg(g.name) group_names FROM users u JOIN groups g ON g.id = ANY (u.group_ids)
  GROUP BY u.id, u.name;

Если мы выполним этот запрос на данных примера, показанных в начале ответа, мы получим следующие результаты:

u.id u.name  group_names
1    Test1   {Group1,Group2,Group3}
2    Test2   {Group3,Group4}
...