使用连接的帖子的 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 全选未选择(添加)标签的主要内容,如果未能解决你的问题,请参考以下文章

苹果手机网页全选功能怎么突然没有了?如何重新添加?

使用连接时为每个不同的字段值选择随机行

MYSQL - 从列中选择一个值或(如果没有给出值)全选[关闭]

如何使用cmd命令将数据导入数据库

在 MySQL 中使用多个标签搜索标签表或“全选”

Vue的全选功能实现思路