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

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

基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”其搜索结果,就像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。

以上是 Mysql连接查询匹配所有标签的多个“标签”(多对多关系)? 的全部内容, 来源链接: utcz.com/qa/432490.html

回到顶部