代码之家  ›  专栏  ›  技术社区  ›  ccoeder

我应该如何设计一个用户阻塞系统?

  •  0
  • ccoeder  · 技术社区  · 7 年前

    我创建了一个小的社交网站,里面有用户生成的内容。如果用户不喜欢他们发布的内容,他们应该可以选择相互阻止。

    所以我使用的是PostgreSQL,我有三个简单的表。

    Table User
    id (pk)  | user_name
    1       | a
    2       | b
    3       | c
    
    Table Post
    id (pk)  | user_id (fk)
    1       | 1
    2       | 3
    3       | 2
    4       | 2
    
    Table Block
    id (pk) | blocker_id (fk)  | blocked_id (fk)
    1       | 1              | 2
    2       | 2              | 1
    

    顺便说一句,正如你所看到的,我使用双向块,因为我不希望用户1阻止用户2,用户2也不应该看到用户1的文章。

    我写了一个SQL:

    SELECT * FROM Post p INNER JOIN Block b
    ON p.user_id = b.blocker_id
    WHERE b.blocked_id <> @current_user_id
    

    但如果用户没有阻止任何人呢?此SQL不包括这种情况,它只显示用户在 表。

    我所期待的:

    • 对于用户1,此SQL应返回用户3和用户1的日志。
    • 对于用户2,它应该返回用户3和用户2的帖子。
    • 对于用户3,它应该返回 每个用户 帖子。

    我该怎么做?

    谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Lajos Arpad    7 年前

    select *
    from User
    join Block
    on User.id = Block.blocker_id or User.id = Block.blocked_id
    

    select *
    from Post p
    where p.user_id = @current_user_id and
          not exists (select id
                      from Block
                      where Block.blocker_id = p.user_id or Block.blocked_id = p.user_id)
    

    select *
    from Post p
    where
    not exists (select id
    from Block
    where ((Block.blocked_id = p.user_id) and (Block.blocker_id = @current_user_id)) or ((Block.blocked_id = @current_user_id) and (Block.blocker_id = p.user_id))
    

        2
  •  2
  •   Thorsten Kettner    7 年前

    NOT EXISTS NOT IN

    SELECT * 
    FROM post 
    WHERE user_id not in (select blocked_id from block where blocker_id = @current_user_id);