我正在尝试查询与一组给定标签中的所有标签匹配的对象。
基本上,我希望用户能够添加越来越多的标签来过滤或“缩小”他们的搜索结果,就像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“隐藏”。
如何匹配所有的标签以获得我想要的“缩小范围”或“向下钻取”的效果?谢谢。
发布于 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子句。
如果您只想要同时存在两个标记的行,则不需要左连接。
https://stackoverflow.com/questions/3267609
复制相似问题