0

我正在实现基于标签的搜索,用户可以在其中插入多个标签来搜索特定实体。一个实体可以有多个标签。但是没有必要将用户搜索的所有标签都列在结果中。

例如,在用户输入三个标签的情况下,例如“鞋”、“皮革”、“正式”,具有这些标签中的一个或多个的每个实体都可以在列表中。

我正在使用联合返回具有这些关键字中的任何一个的实体的完整列表,但问题是我希望它们根据类别中找到的标签数量进行排序。

例如,具有所有三个标签“鞋子”、“皮革”、“正式”的实体应该位于只有其中一个或两个标签的实体之上。是否有任何 sql 功能来执行这种搜索?

[编辑]

我的表格布局是:

实体表

  • 实体名称
  • Entity_id(auto inc 主键)

标签表

  • 标签
  • Entity_id

我无法解决我的目的。现在使用这个查询:

select entity.entity_name from entity.entity_id join tags on tags.entity_id=entity.entity_id where tags.tag="first tag"
union 
select entity.entity_name from entity.entity_id join tags on tags.entity_id=entity.entity_id where tags.tag="second tag"
union 
select entity.entity_name from entity.entity_id join tags on tags.entity_id=entity.entity_id where tags.tag="third tag"

正如我所说,这并不能解决我的目的。

4

1 回答 1

1

这应该为你做:

 select entity_name, count(*) count
   from (
         select e.entity_name, t.tag
           from tag t
           join entity e on (t.entity_id = e.entity_id)
          where t.tag in ('tag', 'tag', 'tag')
         )x
  group by entity_name
  order by count desc

它按实体计算匹配的标签,然后首先将它们与最高匹配进行排序。

另请注意,布尔样式全文匹配将提供这样的功能。

于 2012-09-18T23:29:11.283 回答