我正在建立一个包含帖子的网站,每个帖子可以有零个或多个标签。用户可以选择零个或多个要阻止的标签。如果标签被阻止,则意味着选择帖子的查询将不会选择任何带有用户阻止标签的帖子。我已经能够进行查询以排除带有任何特定标签的帖子,但是当我尝试添加一个排除带有用户阻止标签的帖子的子句时,它不起作用。不仅带有阻止标签的帖子仍然显示,而且我得到了重复的帖子(每个帖子带有的标签都有一个重复的帖子),并且我没有得到任何没有标签的帖子。我如何允许用户指定任意数量的阻止标签,然后根据帖子的标签过滤帖子查询?
以下是相关表格的示例,简化为仅显示相关列:
帖子
ID | 标题 |
---|---|
1 | 帖子 A |
2 | 帖子 B |
3 | 帖子 C |
标签
ID | 姓名 |
---|---|
1 | 标签 1 |
2 | 标签 2 |
3 | 标签 3 |
帖子标签
ID | 标签 | 邮政 |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 3 | 2 |
被阻止的标签
ID | 标签 | 用户 |
---|---|---|
1 | 1 | 用户1 |
2 | 2 | 用户1 |
3 | 3 | 用户2 |
我的查询看起来像这样(实际查询中还有更多内容,我只是展示基本内容和相关子句):
SELECT *
FROM posts
JOIN tags_posts ON tags_posts.post = posts.id
WHERE tags_posts.tag NOT IN
(SELECT blocked_tags.tag
FROM blocked_tags
WHERE blocked_tags.user = :user)
:user 将被替换为当前用户的 ID。假设当前用户是 user1,那么根据上表中的数据,我预计此查询将返回以下内容:
ID | 标题 |
---|---|
2 | 帖子 B |
3 | 帖子 C |
如果当前用户是 user2 那么我希望它返回以下内容:
ID | 标题 |
---|---|
1 | 帖子 A |
2 | 帖子 B |
但无论我是哪个用户,我都会得到以下信息:
ID | 标题 |
---|---|
1 | 帖子 A |
1 | 帖子 A |
2 | 帖子 B |
过滤帖子的正确方法是什么,以便排除任何带有用户屏蔽标签的帖子?谢谢。