2010-08-02 4 views
1

나는 세 개의 테이블 categories, tagstaggings을 가지고 있습니다. categories 테이블은 관련 열이 id, lft, rgtparent_id 인 중첩 세트 방식으로 결합됩니다. 태그는 idname입니다. 타칭은 tag_idtaggable_id이며 categories.id을 나타냅니다.MySQL 쿼리 통합은 테이블과 중첩 세트 모두 조인

가능한 경우 필드에 반환하는 하나의 쿼리 (예 : tag_list)에 카테고리 및 해당 조상의 태그가 모두 포함 된 문자열을 사용하고 싶습니다. 돌아 I 쿼리 SELECT ??? FROM categories에 대한 싶습니다

카테고리

id | parent_id | lft | rgt 
1 |  NULL | 1 | 6 
2 |   1 | 2 | 5 
3 |   2 | 3 | 4 

태그

id | name 
1 | cool 
2 | rad 
3 | soup 

Taggings

id | tag_id | taggable_id 
1 |  1 |   1 
2 |  2 |   2 
3 |  3 |   3 

: 그래서 다음과 같은 스키마를 제공

id |  tag_list 
1 |   cool 
2 |  rad cool 
3 | rad cool soup 

배경 정보 : 나는 Rails를 실행 중이며 검색을 위해 Sphinx를 생각하고 중첩을 위해 awesome_nested_set을 사용하고 있습니다. 나는 categories이라는 테이블을 가지고 있는데, has_many_through 관계에 많은 tags이 있습니다. 내가 MySQL을 만 SQLite는에 대해 그것을 확인하지 않았기 때문에 구문이 100 %되지 않을 수 있습니다

답변

2
SELECT node_id, group_concat(name SEPARATOR ' ') 
FROM taggings INNER JOIN tags ON taggings.tag_id=tags.id 
INNER JOIN (SELECT node.id AS node_id, parent.id AS parent_id 
FROM categories AS node, 
categories AS parent 
WHERE node.lft BETWEEN parent.lft AND parent.rgt) subcategories 
ON subcategories.parent_id=taggings.taggable_id 
GROUP BY (node_id); 

음, 하나 나는

편집이 :) 것을하고 일 또는 세 가지를 배웠습니다.

+0

감사합니다. 이것은 훌륭하게 작동하지만 SQL-fu가 내 수준보다 충분히 높기 때문에 일단 롤을 그룹화하면 논리를 따라갈 수 없습니다. 중간에있는 괄호로 묶인 쿼리가 카테고리와 조상의 매핑을 만드는 방법을 이해하고, 이것이 카테고리의 상속 된 태그를 결정하는 데 도움이되는 방법을 알 수 있습니다.하지만 나머지가 정확히 어떻게 들어 맞는지 정확히 알 수는 없습니다. 그룹화 단계에서 나를 도울 수있는 친절한 분이라면 감사 할 것입니다. –

+0

내 이전 의견에 대한 후속 조치 ... 신경 쓰지 마! 나는 그것을 지금 이해한다. 빛나는 작품! –

+0

중첩 세트는 새로운 부분이었습니다. 이를 이해하기 위해서는 ID가 약간 혼란 스럽기 때문에 약간 변경해야했습니다. 그래서 tag.id와 tagggings.tag_id를 가져 와서 10을 곱했습니다. 그룹화를 위해 group_concat을 사용했습니다. 기본적으로 모든 그룹 함수 (최대, 합계 등)와 동일하게 작동하며 ID 만 연결합니다. ID가 반복되는 단일 테이블 인 더 단순한 스키마에서 시도해보십시오. – MPelletier