개체에 적용되는 "태그"그룹을 저장해야합니다. 내가의 라인을 따라 뭔가를 사용하는 생각을했다 : Gmail의 "암시 소셜 그래프"알고리즘 (see this question)를 구현하는 가장 효율적인 방법으로 두 그룹의 항목을 교차시키는 방법은 무엇입니까?
그러나 위해, 내가 포함 된 태그의 그룹을 검색 할 수 있어야 하나 더 구체적인 태그.
그래서 내 질문에 가장 효율적인 방법으로 MySQL에서 항목의 두 그룹의 교차점을 얻는 것입니다?
개체에 적용되는 "태그"그룹을 저장해야합니다. 내가의 라인을 따라 뭔가를 사용하는 생각을했다 : Gmail의 "암시 소셜 그래프"알고리즘 (see this question)를 구현하는 가장 효율적인 방법으로 두 그룹의 항목을 교차시키는 방법은 무엇입니까?
그러나 위해, 내가 포함 된 태그의 그룹을 검색 할 수 있어야 하나 더 구체적인 태그.
그래서 내 질문에 가장 효율적인 방법으로 MySQL에서 항목의 두 그룹의 교차점을 얻는 것입니다?
은 (값 주어진) 하나 개의 특정 태그를 포함하는 모든 세트 찾기 :
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하는 감사)에 비해 성능 특성을 모르겠지만 여기
는
가 일반화를한다는 것을 마지막으로 구현
감사합니다. 실제 사용하기에 충분히 빠르지 않은지 확인하기 위해 벤치 마크를 수행 할 것입니다. . – Manu
'HAVING'은 더 간단하고 더 빠른'HAVING COUNT (*) = 3' –
으로 대체 될 수 있습니다. 즉각적으로 훨씬 더 휴대 가능합니다. 의견을 주셔서 감사합니다, 나는 내 응답을 업데이 트했습니다 (그러나 참조 용으로 원본을 남겼습니다). – checkorbored
특정 효율성 요구 사항이있는 경우이를 명확하게 지정하여 만족스러운 응답을 받았는지 여부를 결정할 수 있습니다. – checkorbored