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

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

凌翔宇
2023-03-14
问题内容

我正在尝试查询与所有给定标记集匹配的对象。

基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”其搜索结果,就像newegg.com一样。

我的表结构是一个对象表,一个标签表和一个MANY:MANY关系表ObjectsTags。所以我有一个像这样的JOIN查询:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)

我尝试使用IN子句/条件,如下所示:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name IN ('tag1','tag2')
GROUP BY Objects.id

但是我了解到,这模拟了一系列OR,因此您向查询中添加的标签越多,得到的结果就越多,而不是像我希望的那样缩小结果集。

我还尝试过执行多个LIKE WHERE条件,并将其与在一起:

SELECT * FROM Objects
LEFT OUTER JOIN ObjectsTags ON (Objects.id=ObjectsTags.object_id)
LEFT OUTER JOIN Tags ON (Tags.id=ObjectsTags.tag_id)
WHERE Tags.name LIKE 'tag1' 
AND Tags.name LIKE 'tag2'
GROUP BY Objects.id

但这不会返回任何结果,因为将结果分组在一起时,OUTER JOINed Tags.name列仅包含“ tag1”,而不包含“
tag2”。GROUPING将“ tag2”匹配的结果行​​“隐藏”。

如何匹配所有标签以获得我想要的“缩小”或“向下钻取”效果?谢谢。


问题答案:

采用:

  SELECT * 
    FROM OBJECTS o
    JOIN OBJECTSTAGS ot ON ot.object_id = o.id
    JOIN TAGS t ON t.id = ot.tag_id
   WHERE t.name IN ('tag1','tag2')
GROUP BY o.id
  HAVING COUNT(DISTINCT t.name) = 2

您缺少HAVING子句。

如果只需要两个标签都存在的行,则不需要LEFT JOIN。



 类似资料:
  • 问题内容: 我正在尝试做的是赋予用户按标签过滤帖子的功能,这样一来,用户 只能看到剩下的要过滤的标签。换句话说,如果用户选择 标签“ tag1”,它将显示具有该标签的帖子,并显示其他帖子,这些帖子 共享但隐藏过滤后没有可见帖子的标签。 我有table的帖子,和标签。具有 和。我已经设法使与特定的标签集一起使用: Let’s say this query gives post_ids 1, 2, 3

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

  • 问题内容: 这似乎很基本,但我无法弄清楚。 我有一个表“ item_tags”,我想选择所有与标签1和2匹配的项目(例如,每个项目都必须同时具有两个标签)。 我将如何在mysql中执行此操作? 创建表是: 谢谢! 问题答案: 使用: 您需要定义GROUP BY和HAVING子句,并且不同标签ID的数量必须等于您在IN子句中指定的标签数。

  • 下面是java代码: 这有帮助吗?我真的不知道了...

  • 问题内容: 我有一个交叉引用表: 我需要选择与 所有 标签集匹配的ID 。例如,如果给我标签,我将获得ID 。如果给我标签,我将不会获得任何ID,因为没有与 所有 标签匹配的ID 。 另外,如果为我提供了标签,那么我也不应该获得任何结果ID,因为搜索将得到一个值,因此没有ID与 所有 标签匹配。 最近两天我一直在拔头发。希望有人可以帮助我。 问题答案: 查询的想法是,您需要将记录数与子句中提供的值

  • 问题内容: 我遇到一个问题,当执行两个表的联接时,无法确定mysql查找具有两个特定“标签”和相同“ hashid”的链接 假设我的表看起来像这样: 链接 标签 我想返回同时具有“有用”和“很棒”标签的行 当前(工作/快速)查询,用于按1个标签查找链接: 阅读文章后,我尝试使用以下内容: 这 不 工作,但它是如此令人难以置信的缓慢,因为无法使用。 有人知道解决方案吗? 问题答案: 问题的类型称为