2012-02-16 6 views
1

개체에 적용되는 "태그"그룹을 저장해야합니다. 내가의 라인을 따라 뭔가를 사용하는 생각을했다 : Gmail의 "암시 소셜 그래프"알고리즘 (see this question)를 구현하는 enter image description here가장 효율적인 방법으로 두 그룹의 항목을 교차시키는 방법은 무엇입니까?

그러나 위해, 내가 포함 된 태그의 그룹을 검색 할 수 있어야 하나 더 구체적인 태그.

그래서 내 질문에 가장 효율적인 방법으로 MySQL에서 항목의 두 그룹의 교차점을 얻는 것입니다?

+0

특정 효율성 요구 사항이있는 경우이를 명확하게 지정하여 만족스러운 응답을 받았는지 여부를 결정할 수 있습니다. – checkorbored

답변

2

은 (값 주어진) 하나 개의 특정 태그를 포함하는 모든 세트 찾기 :

select distinct tags_sets_id 
from tags_has_sets, tags 
where value in ('foo', 'bar') 
and tags_id = id; 

:

select tags_sets_id 
from tags_has_sets, tags 
where value = 'foo' 
and tags_id = id; 

어느 (소정 값) 두 개 이상의 특정 태그를 포함하는 모든 세트를 찾을 정확하게 두 개의 특정 태그를 모두 포함하는 모든 세트를 찾으십시오 :

select t1.tags_sets_id 
from tags_has_sets t1, tags tags1, 
    tags_has_sets t2, tags tags2 
where tags1.value = 'foo' 
and tags2.value = 'bar' 
and t1.tags_id = tags1.id 
and t2.tags_id = tags2.id 
and t1.tags_sets_id = t2.tags_sets_id; 

마지막 솔루션은 유전자가 아닙니다 ralize,하지만 당신은 아마 비행에 n 조인 된 SQL 문을 생성하는 일반화 된 알고리즘을 만들 수 있습니다.

select tags_sets_id 
from tags_has_sets, tags 
where value in ('foo', 'bar', 'baz') 
and id = tags_id 
group by tags_sets_id 
having count(*) = 3; 
-- formerly: having group_concat(distinct value order by value) 
-- ='bar,baz,foo'; 
: 내가 생성 된 조인 방법 (내 초기 제안에 뛰어난 향상을 위해 @ypercube하는 감사)에 비해 성능 특성을 모르겠지만 여기

일반화를한다는 것을 마지막으로 구현
+0

감사합니다. 실제 사용하기에 충분히 빠르지 않은지 확인하기 위해 벤치 마크를 수행 할 것입니다. . – Manu

+0

'HAVING'은 더 간단하고 더 빠른'HAVING COUNT (*) = 3' –

+0

으로 대체 될 수 있습니다. 즉각적으로 훨씬 더 휴대 가능합니다. 의견을 주셔서 감사합니다, 나는 내 응답을 업데이 트했습니다 (그러나 참조 용으로 원본을 남겼습니다). – checkorbored

관련 문제