【发布时间】:2021-04-09 14:40:51
【问题描述】:
我正在为一个项目构建一个提要,一个对象可能会出现在提要中,具体取决于几个地方。
我有一个帖子表,其中有一个组和一个可见性。有些需要会员才能查看,有些是公开的。
帖子
| id | group_id | visibility |
|---|---|---|
| 1 | 1 | public |
| 2 | 1 | member |
| 3 | 2 | public |
| 4 | 2 | member |
成员资格记录在成员表中,并带有成员资格的开始和结束日期:
成员
| id | user_id | group_id | period_start | period_end |
|---|---|---|---|---|
| 1 | 1 | 1 | 2020-01-01 | 2020-02-01 |
| 2 | 2 | 2 | 2020-01-01 | 2020-01-01 |
目前,我的查询只返回用户所属组的帖子:
SELECT posts.*
FROM members
LEFT JOIN posts
ON
posts.group_id = members.group_id AND
posts.visibility IN ('member', 'public') AND
posts.deleted_at IS NULL
WHERE
members.user_id = XYZ AND
members.period_start < now() AND
members.period_end > now();
我想添加一个功能,让用户可以在不成为会员的情况下将群组添加到他们的收藏夹中,这将只在他们的提要中显示公开帖子。
收藏夹
| id | user_id | group_id |
|---|---|---|
| 1 | 1 | 2 |
如何更改上述查询,使其从用户成员组中选择帖子,以及从他们收藏的组中选择公开帖子?
它必须是不同的,所以如果用户既是会员又收藏了帖子,则帖子不会出现两次。
我希望user_id 1 的结果如下所示:
| id | group_id | visibility |
|---|---|---|
| 1 | 1 | public |
| 2 | 1 | member |
| 3 | 2 | public |
【问题讨论】:
标签: sql postgresql join