Meilleur algo: arbre en profondeur et SQL
Car0
-
Caro -
Caro -
Bonjour!
J'ai une table qui représente plusieurs arbres n-aire ainsi (idparent=0 représente la racine de l'arbre) :
id idparent titre (string quelconque)
1 0 A
2 0 B
3 1 A1
4 1 A2
5 0 C
6 3 A11
7 2 B1
8 4 A21
9 2 B2
10 4 A22
J'aimerais obtenir tous les noeuds par ordre de profondeur. C'est à dire:
id: 1, 3, 6, 4, 8, 10, 2, 7, 9, 5
Évidemment, ça ne s'obtient pas simplement par une simple clause ORDER BY en SQL (dommage tient :).
J'ai quelques solutions possibles. Je me demande si quelqu'un n'en verra pas une meilleure ou laquelle retenir/oublier... Avis / suggestion / expertise sur la performance et simple commentaire sont les bienvenues! :)
1-Faire un SELECT * ... ORDER BY id et reconstruire l'arbre par script
2-Ajouter des champs dans la table (rend le ORDER BY très simple mais complique le INSERT INTO car il faut maintenir ces champs). Problème aussi parce que la profondeur de l'arbre n'est pas limité.
3-Faire plusieurs requêtes (fonction récursive).
ex:
function ecrireNoeud($id)
str="SELECT ... WHERE idparent=$id"
exécuter str
while (resultset not EOF)
ecrire titre du noeud
ecrireNoeud(id du noeud)
next ligne
wend
end function
A l'air simple mais pas trop efficace je pense : l'affichage de l'arbre est l'action la plus souvent réalisée
4-Utiliser des procédures stockées ou des SELECT imbriguées pour obtenir un recordset déjà dans le bon ordre
(? j'aimerais assez pouvoir faire ça mais j'en suis encore à chercher si c'est possible et comment faire si oui.)
Merci bien!
Caro
J'ai une table qui représente plusieurs arbres n-aire ainsi (idparent=0 représente la racine de l'arbre) :
id idparent titre (string quelconque)
1 0 A
2 0 B
3 1 A1
4 1 A2
5 0 C
6 3 A11
7 2 B1
8 4 A21
9 2 B2
10 4 A22
J'aimerais obtenir tous les noeuds par ordre de profondeur. C'est à dire:
id: 1, 3, 6, 4, 8, 10, 2, 7, 9, 5
Évidemment, ça ne s'obtient pas simplement par une simple clause ORDER BY en SQL (dommage tient :).
J'ai quelques solutions possibles. Je me demande si quelqu'un n'en verra pas une meilleure ou laquelle retenir/oublier... Avis / suggestion / expertise sur la performance et simple commentaire sont les bienvenues! :)
1-Faire un SELECT * ... ORDER BY id et reconstruire l'arbre par script
2-Ajouter des champs dans la table (rend le ORDER BY très simple mais complique le INSERT INTO car il faut maintenir ces champs). Problème aussi parce que la profondeur de l'arbre n'est pas limité.
3-Faire plusieurs requêtes (fonction récursive).
ex:
function ecrireNoeud($id)
str="SELECT ... WHERE idparent=$id"
exécuter str
while (resultset not EOF)
ecrire titre du noeud
ecrireNoeud(id du noeud)
next ligne
wend
end function
A l'air simple mais pas trop efficace je pense : l'affichage de l'arbre est l'action la plus souvent réalisée
4-Utiliser des procédures stockées ou des SELECT imbriguées pour obtenir un recordset déjà dans le bon ordre
(? j'aimerais assez pouvoir faire ça mais j'en suis encore à chercher si c'est possible et comment faire si oui.)
Merci bien!
Caro
A voir également:
- Meilleur algo: arbre en profondeur et SQL
- Meilleur site de telechargement - Accueil - Outils
- Meilleur site partage abonnement - Accueil - Services en ligne
- Meilleur site de vente entre particulier - Guide
- Meilleur widget iphone - Guide
- Meilleur logiciel de sauvegarde gratuit - Guide
2 réponses
salut,
je ne sais pas si ton arbre va contenir beaucoup d'items et si les opérations les plus nombreuses vont être des sélections ou des ajouts/suppressions.
mais il y a une chose intéressante, si c'est surtout de la sélection ou, si ajout/suppression il y a, l'arbre est assez petit pour supporter cette façon de faire
personnellement je la trouve très intéressante dans certains cas, c'est la représentation intervallaire
mets tes lunettes de soleil, Brouard est excellent en SQL mais sûrement un peu daltonien
http://sqlpro.developpez.com/Tree/SQL_tree.html
kinder.surprise,
caractère banane
je ne sais pas si ton arbre va contenir beaucoup d'items et si les opérations les plus nombreuses vont être des sélections ou des ajouts/suppressions.
mais il y a une chose intéressante, si c'est surtout de la sélection ou, si ajout/suppression il y a, l'arbre est assez petit pour supporter cette façon de faire
personnellement je la trouve très intéressante dans certains cas, c'est la représentation intervallaire
mets tes lunettes de soleil, Brouard est excellent en SQL mais sûrement un peu daltonien
http://sqlpro.developpez.com/Tree/SQL_tree.html
kinder.surprise,
caractère banane
L'arbre peut contenir effectivement beaucoup d'items (j'estime dans les 2, 3 milles en moyenne). Le SELECT est de beaucoup l'opération la plus utilisée. INSERT sera "assez utilisé" (disons 1 INSERT pour 20 SELECT...) et DELETE très très peu.
Génial, je vais lire ton article :-) L'intro me semble très prometteuse. Merci.
Caro
(ouahhou.. lol. j'viens comprendre à quoi serve les lunettes de soleil.)
Génial, je vais lire ton article :-) L'intro me semble très prometteuse. Merci.
Caro
(ouahhou.. lol. j'viens comprendre à quoi serve les lunettes de soleil.)