我正在尝试查询与给定的一组标签匹配的对象。
基本上,我希望用户能够添加越来越多的标签,以过滤或“缩小”他们的搜索结果,类似于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,所以你添加到查询的更多的标签更多的结果,而不是像我希望的结果集缩小。
我也尝试过多个类似的条件,并在一起:
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“隐藏”。
如何匹配所有的标签,以获得我之后的“缩小”或“深入”效果?谢谢。