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

多对多关系,以确定用户是否喜欢帖子

  •  0
  • jens  · 技术社区  · 6 年前

    我有一个包含所有帖子的表。我还有一个表,当用户喜欢带有外键user\u id和post\u id的帖子时,会在其中添加一行。

    我想检索 全部 以及特定用户是否喜欢该帖子。使用外部连接,我最终两次获得一些帖子。一次用于用户1,一次用于用户2。如果我使用WHERE来过滤喜欢的内容。user\u id=1并且喜欢。user\u id为空,我没有得到只有其他用户喜欢的帖子。

    理想情况下,我可以通过一个查询来实现这一点。SQL不是我的强项,所以我甚至不确定是否需要子查询或联接是否足够。

    很抱歉这么含糊,但我认为这是一个很常见的问题,应该有一定的意义。

    编辑:我创建了一个DB,处理我提到的两个查询。 https://www.db-fiddle.com/f/oFM2zWsR9WFKTPJA16U1Tz/4

    最新消息:昨晚找到了答案。这就是我的结局:

    SELECT
    posts.id AS post_id,
    posts.title AS post_title,
    CASE
    WHEN EXISTS (
      SELECT *
      FROM likes
      WHERE posts.id = likes.post_id
      AND likes.user_id = 1
    ) THEN TRUE
      ELSE FALSE END
      AS liked
    FROM posts;
    

    虽然我能够解决这个问题,但也要感谢@wildplasser的回答。

    2 回复  |  直到 6 年前
        1
  •  3
  •   wildplasser    6 年前

    数据(我需要对其进行一些更改,因为不应将其分配给序列):


     CREATE TABLE posts (
      id serial,
      title varchar
    );
    
    CREATE TABLE users (
      id serial,
      name varchar
    );
    
    CREATE TABLE likes (
      id serial,
      user_id int,
      post_id int
    );
    
    INSERT INTO posts (title) VALUES ('First Post');
    INSERT INTO posts (title) VALUES ('Second Post');
    INSERT INTO posts (title) VALUES ('Third Post');
    
    INSERT INTO users (name) VALUES ('Obama');
    INSERT INTO users (name) VALUES ('Trump');
    
    INSERT INTO likes (user_id, post_id) VALUES (1, 1);
    INSERT INTO likes (user_id, post_id) VALUES (2, 1);
    INSERT INTO likes (user_id, post_id) VALUES (2, 2);
    

    -- I want to retrieve a list of ALL of the posts and whether or not a specific user has liked that post
    SELECT id, title
            , EXISTS(
                    --EXISTS() yields a boolean value
                    SELECT *
                    FROM likes lk
                    JOIN users u ON u.id = lk.user_id AND lk.post_id=p.id
                    WHERE u.name ='Obama'
                    ) AS liked_by_Obama
    FROM posts p
            ;
    

    结果:


     id |    title    | liked_by_obama 
    ----+-------------+----------------
      1 | First Post  | t
      2 | Second Post | f
      3 | Third Post  | f
    (3 rows)
    
        2
  •  0
  •   mypetlion    6 年前

    据我所知,您有两个表,例如包含来自不同用户的所有帖子的post表和一个类似的表 user.id post id . 如果你只想检索帖子,那么

    select * from posts
    

    如果您还需要用户信息,请参阅 user 表中,然后您可以执行以下操作。

    select user.user_name, post.postdata from user,post where post.userid=user.userid
    

    在上述查询中, user_name 是中的列名 使用者 表和 postdata 是中的列 post 桌子