使用连接的帖子的 MySQL 全选未选择(添加)标签
Posted
技术标签:
【中文标题】使用连接的帖子的 MySQL 全选未选择(添加)标签【英文标题】:MySQL Select All not selected(added) tags for a post using joins 【发布时间】:2021-07-22 18:12:43 【问题描述】:要选择(查询)所有选择(添加)的标签,我将使用代码:
SELECT `tags`.`name`
FROM `post_tag`
LEFT JOIN `tags` ON `post_tag`.`tag_id` = `tags`.`id`
WHERE `post_tag`.`post_id` = '12'
如何使用join查询所有未添加到帖子中的标签
帖子
id | title |
---|---|
1 | post 1 |
2 | post 2 |
标签
id | name |
---|---|
1 | tag 1 |
2 | tag 2 |
post_tag
post_id | tag_id |
---|---|
1 | 12 |
2 | 2 |
2 | 4 |
2 | 7 |
2 | 6 |
2 | 8 |
【问题讨论】:
我迷路了。为什么tag_id
的值不在tags
表中?
仅供参考。我是堆栈溢出 Markdown 编辑器的新手。我现在正在学习如何写一个问题。
【参考方案1】:
据我了解,您的问题是:给定一个帖子 ID(例如 2),返回所有未与该特定帖子 ID 关联的标签。因此,在您的示例中,应该返回 Tag 1,因为它不是与 Post 2
相关联的那些之一如果我的解释是正确的并且您只想使用join
,您可以使用以下内容:
SELECT t.name
FROM tags AS t LEFT JOIN post_tag AS pt ON pt.tag_id = t.id
WHERE pt.tag_id IS NULL OR pt.post_id != 2
GROUP BY pt.tag_id;
此查询的作用是从post_tag
中获取所有为 NULL 的标签(它们未与任何现有帖子连接)或与除您正在分析的帖子之外的所有帖子(在您的示例中为 2 )。 group by
是为了避免重复。
另一个更具可读性和效率的解决方案是使用subquery
SELECT name FROM tags WHERE id NOT IN (
SELECT tag_id FROM post_tag WHERE post_id = 2
);
【讨论】:
假设我有 5000 个与帖子无关的标签。哪个高效 肯定是子查询。加入需要评估所有其他帖子/标签关系。 我可以使用 IN 或 Joins 来获取帖子的所有标签。选择terms
987654328 @,terms
987654330 slug
987654331 @左加入terms
ON post_term
987654333 terms
987654337 post_term
987654337 @ 987654338 post_term
987654337 '2'; SELECT name FROM tags WHERE id IN (SELECT tag_id FROM post_tag WHERE post_id = 2);【参考方案2】:
如何查询所有未添加到帖子的标签?
如果这是您的问题,方法是生成所有帖子/标签组合,然后删除存在的:
select p.*, t.*
from posts p cross join
tags t
post_tags pt
on pt.post_id = p.id and pt.tag_id = t.id
where pt.post_id is null; -- there is no match
【讨论】:
非常感谢 @RaghavendraKJ 。 . .这不符合您的要求? 假设如果我想要所有与 post id = 2 无关的标签。我在哪里可以使用你的 SQL 中的 post id @RaghavendraKJ 。 . .那么你会有一个不同的问题。我在这个答案中引用了这个问题。应该提出一个不同的问题作为新问题。以上是关于使用连接的帖子的 MySQL 全选未选择(添加)标签的主要内容,如果未能解决你的问题,请参考以下文章