【问题标题】:How to query tags and tag groups similar to faceted search如何查询类似于分面搜索的标签和标签组
【发布时间】:2014-07-12 17:14:56
【问题描述】:

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

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

给定以下表结构:

动物(即“Max”、“Toby”、“Buster”)

标识 |名字

动物标签(地图)

动物ID |标签标识

标签(即“黑色”、“棕色”、“白色”、“狗”、“猫”、“男性”、“女性”)

标识 |标记

标签组(映射表)

标签ID |标签组ID

标签组(即“颜色”和“性别”)

标识 |标签组

这是我的尝试:

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,并且存储过程确实发挥了它的魔力。

【问题讨论】:

  • 嗨凯文,我一直处于这种情况,您需要传递已选择的值,或者如果没有选择则假定全部。问题是我目前正在打电话,请随时给我发消息,如果仍然需要,我很乐意在今晚晚些时候提供帮助

标签: sql sql-server faceted-search


【解决方案1】:

如果您想获取所有标记为'brown','black','male' 的动物,则可以使用类似的方法(示例)。您需要先将 join 映射到映射表 AnimalTags,然后再将 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')

【讨论】:

  • 我知道,但我面临的挑战是使用标签组。我正在寻找('棕色'或'黑色')和('男性')。同一组中的任何内容都应该是 OR,而不同组中的任何内容都应该是 AND。用英语术语来说,如果用户没有选择颜色,我们假设他们可以使用任何颜色并且不指定任何 WHERE 子句。一旦他们指定了颜色,我们就将动物限制为仅分配了该颜色标签的动物。一旦他们选择了第二种或第三种颜色,这意味着他们可以使用“黑色”或“棕色”或“棕褐色”。现在添加另一个组的标签不是“OR”,而是“AND”...
猜你喜欢
  • 1970-01-01
  • 2016-09-10
  • 2011-07-14
  • 2012-02-04
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多