当前位置: 首页 > 面试题库 >

mysql多对多关系查询。如何获取已过滤帖子的所有标签?

梁丘伟
2023-03-14
问题内容

我正在尝试做的是赋予用户按标签过滤帖子的功能,这样一来,用户
只能看到剩下的要过滤的标签。换句话说,如果用户选择
标签“ tag1”,它将显示具有该标签的帖子,并显示其他帖子,这些帖子
共享但隐藏过滤后没有可见帖子的标签。

我有table的帖子,posts_tags和标签。Posts_tags具有post_id
tag_id。我已经设法使post_ids与特定的标签集一起使用:

SELECT pt.post_id
FROM posts_tags pt
    INNER JOIN tags t
        ON pt.tag_id = t.id
WHERE t.name IN ('tag1', 'tag2', 'tag3')
GROUP BY pt.post_id
HAVING COUNT(DISTINCT t.id) = 3;

Let’s say this query gives post_ids 1, 2, 3:

post 1 has tag1, tag2, tag3 and tag4
post 2 has tag1, tag2, tag3 and tag5
post 3 has tag1, tag2, tag3 and tag6

现在,我的问题是如何扩展查询以仅向用户返回tag4,tag5和 tag6,因为这些标记仍可用于
进一步过滤帖子。如何实现呢?

注意性能也很好。我有130000个帖子,6500个标签,桥表有240000行。

编辑:使用方案:

  1. 用户使用自动完成功能标记标签,并选择多个标签。
  2. 用户根据提交的标签检索帖子。
  3. 用户搜索更多标签,此时:
    我不想给出完整的清单,而只给出那些

一种。尚未选择。

编辑:基于Mosty Mostacho的答案的最终查询:

SELECT DISTINCT pt2.tag_id, t2.name FROM    
(SELECT pt1.post_id
    FROM posts_tags pt1
    INNER JOIN tags t1
        ON pt1.tag_id = t1.id
    WHERE t1.name in ('tag1','tag2','tag3')
    GROUP BY pt1.post_id
    HAVING COUNT(DISTINCT t1.id) = 3) MatchingPosts
INNER JOIN posts_tags pt2 ON (MatchingPosts.post_id = pt2.post_id)
INNER JOIN tags t2 ON (pt2.tag_id = t2.id)
WHERE t2.name NOT IN ('tag1','tag2','tag3');

问题答案:

好吧,这是我在凌晨4:30想到的最好的方法:

SELECT distinct tag_id FROM
    (SELECT pt1.post_id FROM pt1
    INNER JOIN tags t1 ON (pt1.tag_id = t1.id)
    WHERE t1.id IN (1, 2)
    GROUP BY pt1.post_id
    HAVING COUNT(DISTINCT t1.id) = 2) MatchingPosts
INNER JOIN pt2 ON (MatchingPosts.post_id = pt2.post_id)
WHERE (pt2.tag_id NOT IN (1, 2))

(1,2)是您要寻找的标签,计数当然必须与您要用来过滤的标签数量相匹配。



 类似资料:
  • 问题内容: 假设我有以下三个表来表达一个关系,在这些关系中,帖子被赋予了标签(多对多关系): 现在,假设我想查找所有带有标签{clever,interesting}且没有其他标签的帖子。 这是我失败的尝试。它查找带有标签{clever,interesting}的帖子,但也查找具有标签{clever,interesting,annoying}或{clever,interesting,unthical

  • 问题内容: 我正在尝试查询与所有给定标记集匹配的对象。 基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”其搜索结果,就像newegg.com一样。 我的表结构是一个对象表,一个标签表和一个MANY:MANY关系表ObjectsTags。所以我有一个像这样的JOIN查询: 我尝试使用IN子句/条件,如下所示: 但是我了解到,这模拟了一系列OR,因此您向查询中添加的标签越多,得到的结果就越多,

  • 问题内容: 我需要使用类别表过滤查询,该类别表与另一个表具有many2many关系。是否可以过滤与many2many关系的查询? 表具有与表相关的many2many字段,或者说伙伴可以具有许多类别。我需要的是过滤具有类别“业务”或“零售”的表。如果没有任何这些类别,则不应显示。 此外还有另外一个领域是,有关系有: 具有以下关系的字段: 到(many2many) 到(one2many) (字符) 具

  • 我正在读MongoDB在行动这本书。我有一个关于的问题。 在中,该书给出了一个多对多关系的示例。它给出了文档和文档。 我理解这里的多对多关联。基本上,可以有一个带有_id等数组的键。所以我不想问类似MongoDB多对多关联的问题 我的问题是关于的,书中给出了关于查询多对多关系的两个示例查询。下面是两个查询: > 是什么意思?我以为只存在于Ruby驱动程序中。 中的是什么?是收藏吗? 中的是什么?

  • 问题内容: 我在用户和角色之间有很多关系。例如 我的要求是获取系统中所有具有其角色的用户。当使用HQL使用我的查询是 但是,这会触发具有相应角色的每个用户的查询。如果有100个用户,它将触发100个查询。但是在SQL中,我可以使用以下查询来实现 我正在为用户进行左外部联接,因为有些用户没有关联的角色。我宁愿不使用本机SQL,因为它有其自身的缺点。有人可以帮我映射相应的HQL或JPQL查询吗? 问题

  • 问题内容: 首先,我认为这是一个漫长的尝试,但希望有人可以提供帮助。 为了解释当前情况,目前,我有一个自定义插件,可以获取有关用户及其最新4条帖子的各种信息。 我也在使用WPBook插件(所以这是在facebook上,只是一个典型的wordpress网站) 好的,这是我的代码,它为用户抓取了4条最新帖子: 我尝试按照本教程进行操作,但没有使用单独的插件,而是将代码放在了现有的插件中,但现在页面无法