2010-12-03 19 views
0

J'ai une table qui contient uniquement les relations entre les groupes pour une application qui peut avoir une quantité infinie de sous-groupes.Sélection récursive de la plus grande récursivité dans 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 
); 

Le type "shop" signifie essentiellement son top. Maintenant je dois pouvoir obtenir le groupe le plus haut pour n'importe quel groupe que je pourrais analyser. J'ai regardé dans la syntaxe de LOOP de MySQL mais je ne peux pas comprendre comment mélanger ceci avec des requêtes réelles sur la base de données . Est-ce que quelqu'un peut me donner un indice quant à la façon dont je pourrais être en mesure de sélectionner récursivement le groupe parent jusqu'à ce que je sois dans le groupe le plus haut? Je sais que cela peut être risqué vu qu'il peut y avoir une quantité infinie de sous-groupes mais en pratique cela ne sera jamais plus de 2 ou 3 sous-groupes et je peux facilement imposer une limite stricte à cela.

Merci

Répondre

0

Si vous êtes ok avec une limite difficile, vous pouvez simplement utiliser des jointures.

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 

Il est évidemment pas récursive si vous ne pouvez pas continuer indéfiniment, mais vous pouvez ajouter autant de jointures que vous attendez raisonnablement dans votre ensemble de données. Ce n'est pas terriblement rapide, mais il y aura au moins un court-circuit, une fois que vous atteindrez le parent supérieur, il passera essentiellement le reste des jointures.

+0

Merci Rob, c'est en effet quelque chose que je peux faire, je n'ai même pas pensé à ça. J'aimerais toujours savoir si c'est possible de le faire dans une boucle si. Mais pour l'instant votre solution fera l'affaire, il ne devrait jamais y avoir plus de 3/4 sous-groupes. – Naatan

+0

Avec MySQL, vous ne pouvez faire que la "boucle" dans une procédure stockée car elle ne supporte pas les requêtes récursives (contrairement à PostgreSQL ou Firebird). –