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。
我是 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。