【发布时间】:2011-03-17 02:33:34
【问题描述】:
我正在尝试查询与所有给定标签集匹配的对象。
基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”他们的搜索结果,就像 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”。 'tag2' 匹配的结果行被 GROUPing “隐藏”。
如何匹配所有标签以获得我所追求的“缩小”或“向下钻取”效果?谢谢。
【问题讨论】:
标签: mysql join tags many-to-many