PostgreSQL中多对多关系下用户可访问文章数统计问题
统计用户可访问文章数量的解决方案
核心思路
通过sector_id关联两张表是完全正确的方向,关键要避免同一篇文章被同一用户重复统计——比如用户关注多个sector,但某篇文章只属于其中一个,不能因为关联关系重复计数。
具体SQL语句
SELECT u.user_id, COUNT(DISTINCT a.article_id) AS accessible_articles_count FROM users u LEFT JOIN articles a ON u.sector_id = a.sector_id GROUP BY u.user_id;
语句说明
- 关联逻辑:用
users和articles的sector_id做连接,直接匹配用户关注的所有sector对应的文章,这正是你需要的关联方式。 - 去重计数:
COUNT(DISTINCT a.article_id)能保证同一篇文章哪怕被用户通过多个关注的sector匹配到(业务场景中可能出现),也只会被统计一次,避免虚高的计数。 - LEFT JOIN的必要性:如果用户没关注任何sector,或者关注的sector下没有文章,这条语句依然会把用户列出来,计数为0,不会遗漏任何用户。
示例数据运行结果
用你给出的示例数据执行上述SQL,得到的结果如下:
| user_id | accessible_articles_count |
|---|---|
| user1 | 3 |
| user2 | 3 |
对应的逻辑:
- user1关注sector123和234,对应文章article1、article4(属于sector123)和article2(属于sector234),共3篇。
- user2关注sector453和123,对应文章article3(属于sector453)、article1和article4(属于sector123),共3篇。
额外提示
如果你的业务里不存在“同一篇文章属于多个sector”的情况,DISTINCT可以省略,但保留它能让语句更健壮,兼容未来的业务变化。
内容的提问来源于stack exchange,提问作者Inereste
相关产品推荐
相关产品推荐

