首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Mysql join查询匹配所有标签的多个“标签”(多对多关系)?

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

Stack Overflow用户
提问于 2010-07-17 01:57:30
回答 1查看 9K关注 0票数 28

我正在尝试查询与一组给定标签中的所有标签匹配的对象。

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

我的表结构是一个对象表、一个标签表和一个多对多关系表ObjectsTags。所以我有一个连接查询,如下所示:

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,所以在查询中添加的标签越多,得到的结果就越多,而不是像我希望的那样缩小结果集范围。

我还尝试了多个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

但这不会返回任何结果,因为当结果组合在一起时,外部的JOINed Tags.name列只包含'tag1',而不是'tag2‘。匹配'tag2‘的结果行被GROUPing“隐藏”。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-17 01:59:44

使用:

  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子句。

如果您只想要同时存在两个标记的行,则不需要左连接。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3267609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档