我有一个问题,我没有找到答案。
这是一个例子:
表:兴趣
表:用户
我希望这种受欢迎程度'感兴趣的专栏'由于'用户'而计算的表格表。
表用户
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;
有更有效的方法吗?
答案 0 :(得分:0)
康斯坦丁的建议是每次用户订阅特定兴趣时使用触发器来增加“兴趣”表中的受欢迎程度。这可能足够有效,直到有太多会话等待对多个会话正在更新的特定兴趣的行级锁定。
如果您在表“interest”上删除了唯一性约束,则可以使用不会阻止任何内容的插入来动态记录新订阅。要获取整体统计信息,您必须执行SELECT id, count(*) FROM interests GROUP BY id
,如果您定期更新整个表格以重新组合以消除重复项,这可能足够快。
答案 1 :(得分:0)
我已经改变了我的模型来处理这个问题。
有一张独立的桌子,当我需要受欢迎时,我只需依靠一个独特的桌子。键。