Page 1 sur 1

methodologie de parcours d'une table

Posté : 19 avr. 2007, 07:20
par damaskinos
Bonjour,

Je dois gérer des menus de manière dynamique. J'ai crée une table qui a pour colonne
idMenu, idParent, NomMenu

J'aimerais savoir si en une requete c'est possible de sortir un sous arbre ( menu1, menu1.1,menu1.1.1, menu2, menu2.1 etc...). Je n'arrive pas a voir comment je peux lister complètement une feuille jusqu'à son ancêtre le plus haut. Je veux pas avoir 10 milles boucles dans mon code php.

Merci de vos sugestion

Posté : 19 avr. 2007, 10:09
par sadeq
Ta table contient un champ "idParent" qui sert à mettre en oeuvre un système hierachique pére/fils, n'est-ce pas? bon.

En conception celà s'appelle une relation reflexive, dont le premier parent a un "idParent" nul.

Pour lister les ascendants d'un menu X, il faut remonter l'arbre des parents par l'indicateur "idParent" jusqu'à ce que ce dernier soit nul.

Car si un "idParent" est nul, comme j'ai dis tout à l'heure, c'est qu'il s'agit du premier menu de l'arboréscence.

Une boucle le lecture des menus par la relation idMenu=idParent peut être effectuée jusqu'à ce que l'idParent lu est nul.

Posté : 19 avr. 2007, 19:01
par damaskinos
merci de ta reponse

En faite, je connais cette méthode et c 'est pour ca j ai écris ici. Je voulais savoir s'il y avait une autre pour éviter de faire des boucles qui vont envoyer plusieurs requetes a ma BD. Si non, peux tu peux me faire un petit algo de la maniere dont tu vois les boucles.

merci

Posté : 20 avr. 2007, 13:18
par sadeq
L'algo peut être le suivant:
menu  = getMenu("select * from menu where id = '?'"); //id d'un menu de départ
while (menu[idParent] != null){
   //recherche par parent
    menu = getMenu ("select * from menu where id = 'menu[idParent]'"); 
   //autre code de traitement
  //.....
}
la fonction getMenu($sql) est à développer : elle doit exécuter sql et retourner un tableau d'enregistrements trouvés

Posté : 20 avr. 2007, 14:28
par iclo
Tout dépend si tu as une longueur fixe pour ton menu, si oui, il est possible de le récupérer directement en une seule requette, en utilisant des alias dans la partie from de la requette.
par exemple, une profondeur de 3 :

Code : Tout sélectionner

select m1.NomMenu, m2.NomMenu, m3.NomMenu from menu m1, menu m2, menu m3 where m3.idParent = m2.id and m2.idParent = m1.id
A tester, et à adapter, mais valable que si tu connais la longeur du menu au départ.

Posté : 20 avr. 2007, 15:34
par sadeq
tu peux écrire le même algo en SQL en écrivant une procédure stockée ou une fonction comme tu peux remplacer la boucle While par une récursivité de fonction.

Posté : 22 avr. 2007, 08:01
par Invité
merci bcp pour vos reponses. J'ai resolu mon problème. ¨ca ressemble beaucoup a ce que sadeq a expliquer.

Merci encore