Postgres: запустить "сводный запрос" по внешнему ключу? - PullRequest
0 голосов
/ 07 сентября 2018

Я использую Postgres 9.6. У нас есть две таблицы, первая из них user:

id   | integer
name | varchar

И второй feature_flag, который имеет внешний ключ для user:

id   | integer
user_id | integer

Я хочу создать таблицу пользователей, которая показывает (среди прочего), какие флаги функций включены пользователем - возможно, со столбцом массива для флагов функций (открытым для улучшенных предложений, например, может быть столбец для флага функции с помощью T /). F).

Таким образом, результаты могут выглядеть следующим образом:

id,name,flags
1,foo,"[1,3]"
2,bar,"[1,2]"

Или вот так:

id,name,flag_1,flag_2,flag_3
1,foo,T,F,T
2,bar,T,T,F

Как мне это сделать? Я знаю, как получить строку для каждого флага на пользователя:

   SELECT u.*, feature_flags 
   FROM "user" u
   OUTER JOIN feature_flag f on f.user_id=u.id

Но тогда как мне повернуть его в вышеприведенное?

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете объединить флаги:

SELECT u.*, array_agg(f.integer) as feature_flags
FROM "user" u
  LEFT JOIN feature_flag f on f.user_id=u.id
group by u.id;

Выше требуется, чтобы "user".id был первичным ключом таблицы "user"

Если у вас есть верхний предел для флагов, вы можете использовать следующее для создания столбцов:

select id, name,
       1 = any(feature_flags) as flag_1, 
       2 = any(feature_flags) as flag_2, 
       3 = any(feature_flags) as flag_3, 
       .... 
from (
  SELECT u.*, array_agg(f.integer) as feature_flags
  FROM "user" u
    LEFT JOIN feature_flag f on f.user_id=u.id
  group by u.id
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...