2010-12-03 289 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 
); 

類型「商店」基本上意味着它的最高。

現在我需要能夠爲我可能解析的任何組獲得最頂級的組。我已經研究了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 2010-12-05 17:44:44