如何查询与分面搜索类似的标签和标签组

时间:2014-07-12 17:14:56

标签: sql sql-server faceted-search

如何执行以下分面搜索语句:

SELECT * FROM animals WHERE animal is assigned to tag ('brown' or 'black') AND tag ('male')

给出以下表格结构:

动物(即'Max','Toby','Buster')

id |名称

AnimalTags(地图表)

animalsId | tagsId

标签(即'black','brown','white','dog','cat','male','female')

id |标签

TagGroups(地图表)

tagsId | tagsGroupId

TagGroup(即'Color'和'Gender')

id | tagGroup

这是我的尝试:

SELECT * FROM animals
INNER JOIN animalTags ON animalTags.animalsId  = animals.id
INNER JOIN tags       ON animalTags.tagsId     = tags.id
INNER JOIN tagGroups  ON tagGroups.tagsId      = tags.id
INNER JOIN tagGroup   ON tagGroups.tagGroupsId = tagGroup.id

然后使用GROUP BY和HAVING我会假设说:

GROUP BY tagGroup
???

需要这个是灵活的,最终这成为一个存储过程,我只是传递像51,69,88这样的标记ID,而存储过程确实发挥了它的魔力。

1 个答案:

答案 0 :(得分:0)

如果你想让所有动物都被标记为'brown','black','male',那么这样的事情会做(例子)。在joinAnimalTags表之前,您需要join到映射表Tags。考虑到每只动物将与一个或多个标签相关联,我已经选择做INNER JOIN。如果情况并非如此,您可以考虑改为LEFT JOIN

SELECT a.* FROM animals a
join AnimalTags at on a.id = at.animalsid
join Tags t on t.id = at.tagsid
where t.tag in ('brown','black','male')