2012-09-18 4 views
0

사용자가 여러 태그를 삽입하여 특정 항목을 검색 할 수있는 태그 기반 검색을 구현합니다. 하나의 엔티티는 많은 수의 태그를 가질 수 있습니다. 그러나 사용자가 검색 한 모든 태그를 검색 결과에 표시 할 필요는 없습니다.선택 항목 수순으로 정렬

예를 들어, 사용자가 "신발", "가죽", "공식"과 같은 세 개의 태그를 입력하면 하나 이상의 태그가있는 모든 엔티티가 목록에있을 수 있습니다.

나는이 키워드 중 하나를 가진 엔티티의 전체 목록을 반환하기 위해 유니온을 사용하고 있지만 카테고리에서 발견 된 태그의 수에 따라 정렬되도록하는 것이 문제입니다.

예를 들어 "신발", "가죽", "공식적인"태그가 모두있는 엔티티는 그 중 하나 또는 두 개만있는 엔티티 위에 있어야합니다. 이런 종류의 검색을 수행 할 수있는 SQL 기능이 있습니까?

[편집]

내 테이블 레이아웃은 다음과 같습니다

엔티티 테이블

  • ENTITY_NAME
  • ENTITY_ID (자동 INC 기본 키)

태그 테이블

내 목적을 해결할 수없는 0
  • 태그
  • 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

좋은 질문 :이 스타일을 사용하여 진행 상황을 명확히했습니다. 먼저 원시 데이터를 가져온 다음 롤 업합니다. 하위 쿼리가 필요하지 않은 것은 당연합니다. –