【问题标题】:Distinct select where row in one of multiple tables不同选择多个表之一中的行
【发布时间】: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


    【解决方案1】:

    认为你只想要union all

    SELECT p.*
    FROM members m JOIN
         posts p
         ON p.group_id = m.group_id AND
            p.visibility IN ('member', 'public') AND
            p.deleted_at IS NULL
    WHERE m.user_id = XYZ AND
          m.period_start < now() AND
          m.period_end > now()
    UNION ALL
    SELECT p.*
    FROM favorites f JOIN
         posts p
         ON p.group_id = f.group_id AND
            p.visibility IN ('public') AND
            p.deleted_at IS NULL
    WHERE f.user_id = XYZ ;
    

    注意连接是内连接,不是外连接。

    我不确定收藏夹是否需要过滤活跃成员;这不包括它。

    你也可以用两个LEFT JOINs 和一些过滤来表达:

    SELECT p.*
    FROM posts p LEFT JOIN
         favorites f
         ON f.group_id = p.group_id AND
            p.visibility IN ('public') LEFT JOIN
         members m LEFT JOIN
         ON p.group_id = m.group_id AND
            p.visibility IN ('member', 'public') AND
            m.period_start < now() AND
            m.period_end > now()
    WHERE p.deleted_at IS NULL AND
          XYZ IN (m.user_id, f.user_id) 
    

    【讨论】:

    • 谢谢,这是完美的。可能有大量帖子,这两个查询之间的性能差异是否很大?
    • @BenedictLewis。 . .这是一个有趣的问题。我认为第一个可能更容易优化。
    猜你喜欢
    • 2013-03-29
    • 2011-06-01
    • 2012-07-03
    • 2022-11-01
    • 2022-01-18
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多