postgresql 按标签名称搜索帖子,在一次查询中返回包含所有相关标签的帖子

w8f9ii69  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(116)

我有三张table。
员额
| 帖子标识|帖子内容|
| - ------| - ------|
| 1个|阿尔法|
| 第二章|贝塔|
帖子标签
| 帖子标识|标签标识|
| - ------| - ------|
| 1个|1个|
| 1个|第二章|
| 第二章|第二章|
标签
| 标签标识|标签名称|
| - ------| - ------|
| 1个|狗|
| 第二章|猫|
在Postgres中,如果我所知道的只是它的一个标签,是否可以进行查询,从帖子和它的两个标签中返回帖子1。
我尝试用下面的查询来实现这一点,但没有成功:

SELECT posts.post_id, posts.post_content, tags.tag_name
FROM posts
JOIN posts_tags
ON posts.post_id = post_tags.post_id 
JOIN tags
ON post_tags.tag_id = tags.tag_id
WHERE tags.tag_name = Dogs;

我希望得到以下结果集
| 帖子标识|帖子内容|标签名称|
| - ------| - ------| - ------|
| 1个|阿尔法|狗|
| 1个|阿尔法|猫|
我应该如何修改我的查询以实现此结果?

vcirk6k6

vcirk6k61#

您的查询不起作用,因为您直接在连接表上进行筛选,从而只挑选满足条件(WHERE tags.tag_name = Dogs)的记录。
相反,您可以先找到具有“tag_name"的“post_id”,然后过滤连接操作的结果。

WITH cte AS (
    SELECT pt.post_id,
           p.post_content,
           t.tag_name
    FROM       posts p
    INNER JOIN post_tags pt
            ON p.post_id = pt.post_id
    INNER JOIN tags      t
            ON pt.tag_id = t.tag_id
)
SELECT post_id, post_content, tag_name
FROM       cte
INNER JOIN (SELECT post_id FROM cte WHERE tag_name = 'Dogs') dogs_tagged
        ON cte.post_id = dogs_tagged.post_id

检查here演示。

相关问题