2012-09-18 45 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

好問題:我使用這種風格來清楚說明發生了什麼:首先獲取原始數據,然後將其捲起來。你當然是正確的,子查詢是沒有必要的。 –