2012-09-18 41 views
0

我正在实施基于标签的搜索,其中用户可以插入多个标签以搜索特定的实体。一个实体可以有多个标签。但是没有必要让用户搜索的所有标签都列在结果中。通过选择的数量排序

例如,当用户输入三个标签,说:“鞋”,“皮革”,“正式”,有这些标签中的一个或多个每一个实体可以在列表中。

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

例如,有三个标签实体,“鞋”,“皮革”,“正式”,应该来正上方,然后只有一个或两个人的实体。有没有任何SQL功能来执行这种搜索?

[编辑]

我的表布局是:

实体表

  • ENTITY_NAME
  • ENTITY_ID(自动增量主键)

标签表

  • 标签
  • 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" 

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

+0

你目前的表格布局是什么?你目前的查询是什么? – Jocelyn

+0

编辑我的问题,只需一分钟 – Sourabh

回答

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 

它通过实体计数匹配的标签,则具有最高符合排序。

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

+1

为什么你有子查询?你可以通过与加入和在哪里相同的级别来让组。 –

+0

好问题:我使用这种风格来清楚说明发生了什么:首先获取原始数据,然后将其卷起来。你当然是正确的,子查询是没有必要的。 –