PostgreSQL:已知单个标签,如何查询帖子及其全部关联标签?
问题:已知帖子一个标签,查询该帖子及其所有关联标签(PostgreSQL)
表结构
posts表:
| post_id | post_content |
|---|---|
| 1 | Alpha |
| 2 | Beta |
post_tags表:
| post_id | tag_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 2 | 2 |
tags表:
| tag_id | tag_name |
|---|---|
| 1 | Dogs |
| 2 | Cats |
原查询问题
你尝试的查询存在两个问题:
- 字符串常量
Dogs未加单引号,PostgreSQL会将其视为标识符而非字符串值; - 直接通过
WHERE tags.tag_name = 'Dogs'过滤,会仅保留标签为Dogs的行,无法获取该帖子关联的其他标签。
正确查询语句
需要先定位所有带有目标标签的帖子ID,再查询这些帖子的全部标签关联数据,以下是两种实现方式:
方法1:使用子查询筛选目标帖子ID
SELECT p.post_id, p.post_content, t.tag_name FROM posts p JOIN post_tags pt ON p.post_id = pt.post_id JOIN tags t ON pt.tag_id = t.tag_id WHERE p.post_id IN ( SELECT pt_inner.post_id FROM post_tags pt_inner JOIN tags t_inner ON pt_inner.tag_id = t_inner.tag_id WHERE t_inner.tag_name = 'Dogs' );
方法2:使用JOIN关联目标帖子
SELECT p.post_id, p.post_content, t.tag_name FROM posts p JOIN post_tags pt ON p.post_id = pt.post_id JOIN tags t ON pt.tag_id = t.tag_id JOIN ( SELECT pt_inner.post_id FROM post_tags pt_inner JOIN tags t_inner ON pt_inner.tag_id = t_inner.tag_id WHERE t_inner.tag_name = 'Dogs' ) target_posts ON p.post_id = target_posts.post_id;
结果说明
执行上述任意语句后,会得到你期望的结果:
| post_id | post_content | tag_name |
|---|---|---|
| 1 | Alpha | Dogs |
| 1 | Alpha | Cats |
内容的提问来源于stack exchange,提问作者Anunnaki Priest
相关产品推荐
相关产品推荐

