2010-12-03 5 views
0

무한대의 하위 그룹을 가질 수있는 앱에 대한 그룹 간의 관계를 순수하게 유지하는 테이블이 있습니다.MySQL에서 가장 재귀를 재귀 적으로 선택

CREATE TABLE `shop_groups_group_rel` (
    `id_group` int(11) NOT NULL, 
    `id_parent` int(11) NOT NULL, 
    `type` enum('shop','group') NOT NULL 
); 

"shop"유형은 기본적으로 그 최상위를 의미합니다.

이제 내가 분석 할 수있는 모든 그룹에 대해 가장 많은 그룹을 얻을 수 있어야합니다. MySQL의 LOOP 구문을 살펴 봤지만 데이터베이스에서 실제 쿼리와 혼합하는 방법을 알 수는 없습니다 .

내가 맨 위 그룹에 올 때까지 반복적으로 상위 그룹을 선택할 수있는 방법에 대한 힌트를 누군가가 줄 수 있습니까?

무한한 양의 하위 그룹이있을 수 있으므로이 작업을 수행하는 것이 위험 할 수 있음을 알고 있지만 실제로는 2 ~ 3 개 이상의 하위 그룹이 될 수 없으며 쉽게이 작업에 엄격한 제한을 적용 할 수 있습니다.

감사합니다.

답변

0

하드 제한이 있어도 조인을 사용할 수 있습니다.

SELECT id_group, 
COALESCE(p4.id_group, p3.id_group, p2.id_group, p1.id_group, g.id_group) 
    as top_id_group 
FROM shop_groups_group_rel g 
LEFT JOIN shop_groups_group_rel p1 ON p1.id_group = g.id_parent 
LEFT JOIN shop_groups_group_rel p2 ON p2.id_group = p1.id_parent 
LEFT JOIN shop_groups_group_rel p3 ON p3.id_group = p2.id_parent 
LEFT JOIN shop_groups_group_rel p4 ON p4.id_group = p3.id_parent 

분명 당신이 무한정 갈 수 있도록 재귀 아니에요하지만 당신은 당신이 합리적으로 데이터 세트에 기대하는만큼 조인 추가 할 수 있습니다. 그것은 엄청나게 빠르지는 않지만 적어도 상위 부모에 도달하면 기본적으로 나머지 조인은 건너 뛸 것입니다.

+0

감사합니다. 롭, 실제로 할 수있는 일입니다. 고려하지 않았습니다. 그래도 LOOP에서이 작업을 수행 할 수 있는지 알고 싶습니다. 그러나 지금 당신의 솔루션은 트릭을 할 것이며, 3/4 이하의 하위 그룹이 있어서는 안됩니다. – Naatan

+0

MySQL에서는 재귀 쿼리 (PostgreSQL 또는 Firebird와 달리)를 지원하지 않으므로 저장 프로 시저에서만 "루프"를 수행 할 수 있습니다. –

관련 문제