У меня есть вопрос, на который я не нашел ответа.
Вот пример:
Таблица: интересы
- id: целое число - первичный ключ
- имя: имя интереса - уникальное
- популярность: интерес популярность
Таблица: пользователи
- id: целое число - первичный ключ
- электронная почта: строка - уникальная
- интересы: массив целых чисел — внешние ключи таблицы «интересы»
Я хочу, чтобы столбец «популярность» таблицы «интересы» вычислялся благодаря таблице «пользователи».
Пользователи таблицы
id | email | interests
0 | toto0.gmail.com | [ 0 ]
1 | toto1.gmail.com | [ 0, 1 ]
2 | toto2.gmail.com | [ 1 ]
3 | toto2.gmail.com | [ 2 ]
Таблица интересов
id | name | popularity
0 | 'interest 0' | 2
1 | 'interest 1' | 2
2 | 'interest 2' | 1
3 | 'interest 3' | 0
Я пробовал это:
UPDATE interests SET popularity = (SELECT COUNT(*) from public.users where ARRAY[interests] @> ARRAY[interests.id]);
Но я не хочу запускать запрос для обновления таблицы интересов. Я имею в виду, что я хочу, чтобы столбец «популярность» заполнялся автоматически, когда пользователь подписывается на него.
Если я создам такое «представление», оно должно работать так, как я хочу?
CREATE VIEW interests_popularity (id, popularity) AS
SELECT COUNT(1) as popularity, interest.id
FROM public.user, interest
WHERE ARRAY[public.user.interests] @> ARRAY[interest.id]
GROUP BY interest.id;
Есть ли более эффективный способ сделать это?