Postgres 连接表并在连接存在时创建新字段

Postgres Join tables and create new field if join exists

我是 Postgres 的新手,我有一个令人困惑的问题。 基本上,我想知道我的 post 是否被用户收藏在新字段 bookmarked = true / false

这是我的表格

CREATE TABLE blog_posts (
      post_id BIGSERIAL PRIMARY KEY NOT NULL,
      title VARCHAR(255) NOT NULL,
      body TEXT NOT NULL,
      pinned BOOLEAN DEFAULT FALSE,
      author VARCHAR(100) REFERENCES users(username) ON DELETE CASCADE NOT NULL,
      author_id BIGINT REFERENCES users(user_id) ON DELETE CASCADE NOT NULL,
      post_banner VARCHAR(255),
      tags VARCHAR[],
      description VARCHAR(255),
      avg_rating FLOAT,
      ratings_count INT DEFAULT 0 NOT NULL,
      created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
    );

CREATE TABLE blog_bookmarks (
        user_id BIGINT REFERENCES users(user_id) ON DELETE CASCADE NOT NULL,
        post_id BIGINT REFERENCES blog_posts(post_id) ON DELETE CASCADE NOT NULL,
        PRIMARY KEY (user_id, post_id)   
      );

这是我的初始查询

SELECT blog_posts.*, count(ratings.*) as ratings_count, avg(ratings.rating) as avg_rating, users.avatar as author_avatar,
     users.name as author_name, users.role as author_role, users.location as author_location, users.description as author_description
     FROM blog_posts
      LEFT JOIN ratings ON ratings.post_id = blog_posts.post_id
      LEFT JOIN users ON users.username = blog_posts.author
     WHERE blog_posts.post_id = 
      GROUP BY blog_posts.post_id, users.avatar, users.name, users.role, users.location, users.description;

可能会有很多多余的代码,但我保留它以防万一我不想删除一些有用的东西。

每当我为 post 添加书签时,我都会用 user_id 和 post_id 创建一条新记录,所以当我查询 post 时,我想以某种方式匹配它们看看是否存在,如果存在,我想要一个新字段 bookmarked = true / false

非常感谢,我很感激

如果有人遇到同样的问题,我就是这样解决的

SELECT blog_posts.* , count(ratings.*) as ratings_count, avg(ratings.rating) as avg_rating, users.avatar as author_avatar,
    users.name as author_name, users.role as author_role, users.location as author_location, users.description as author_description,
      CASE WHEN blog_bookmarks.user_id IS NOT NULL AND blog_bookmarks.post_id IS NOT NULL
      THEN true ELSE false
      END bookmarked
    FROM blog_posts
    LEFT JOIN ratings ON ratings.post_id = blog_posts.post_id
    LEFT JOIN users ON users.username = blog_posts.author
    LEFT JOIN blog_bookmarks ON blog_bookmarks.user_id =  AND blog_bookmarks.post_id = blog_posts.post_id
    WHERE blog_posts.post_id = 
    GROUP BY blog_posts.post_id, users.avatar, users.name, users.role, users.location, users.description, blog_bookmarks.user_id, blog_bookmarks.post_id;

基本上,我加入了一些表,但 CASE 是魔法发生的地方。 $1 是实际进行查询的用户 ID,$2 是已查询的 post_id。