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

tha*_*smt 20 mysql tags many-to-many join

我试图查询匹配给定标签集的所有对象.

基本上我希望用户能够添加越来越多的标签来过滤或"缩小"他们的搜索结果,有点像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)
Run Code Online (Sandbox Code Playgroud)

我尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

我也试过做多个LIKE WHERE条件,ANDed一起:

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
Run Code Online (Sandbox Code Playgroud)

但是这不会返回结果,因为当结果组合在一起时,OUTER JOINed Tags.name列只包含'tag1',而不是'tag2'.'tag2'匹配的结果行​​由GROUPing"隐藏".

如何匹配所有标签以获得我所追求的"缩小"或"向下钻取"效果?谢谢.

OMG*_*ies 29

使用:

  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
Run Code Online (Sandbox Code Playgroud)

你错过了HAVING子句.

如果您只想要存在两个标记的行,则无需LEFT JOIN.