2010-09-13 7 views
2

J'ai un ensemble de données organisées hiérarchiquement qui devraient pouvoir atteindre une taille arbitraire. J'ai besoin de récupérer l'arbre entier, mais je n'arrive pas à comprendre comment le faire avec SQL. Ma solution actuelle consiste à créer une table temporaire et à utiliser une fonction récursive pour interroger successivement les branches de l'arbre et ensuite stocker le résultat dans la table temporaire que j'interroge à nouveau pour produire le résultat souhaité.Requête MySQL récursive?

Ma question est, ce que je fais est essentiellement ce qu'une jointure corrige? Construire une table intermédiaire et ensuite interroger sur les résultats. Il semble qu'il devrait y avoir un moyen de le faire avec des jointures, mais la documentation de MySQL ne couvre que la récupération de parties d'un arbre jusqu'à une profondeur finie. Y a-t-il un moyen de faire cela? Je fais ça en PHP.

+0

MySQL n'a pas de support de requête hiérarchique/récursif. –

+0

similaire question que j'ai demandé, peut être d'une certaine aide: http://stackoverflow.com/questions/2352543/implementing-recursive-comments-in-php-mysql – GSto

Répondre

15

MySQL ne prend pas en charge les requêtes récursives.

Je suggère que vous regardez le projet de loi Karwin de presentation où il compare quatre modèles différents pour stocker des données heirarchical et examine leurs avantages et leurs inconvénients:

  • liste de contiguïté
  • énumération Path
  • ensembles emboîtés
  • table de fermeture

Diapositive 48 montre le relativ La difficulté de certains types de requêtes avec chacun des modèles. D'après votre question, il semble que vous vous intéressiez le plus à "Query subtree", pour lequel la liste d'adjacence (le modèle que vous utilisez actuellement) est la plus mauvaise des quatre.

Si vous souhaitez simplement sélectionner l'arborescence entière, comme dans toutes les données de la table, vous pouvez utiliser la requête simple SELECT * FROM yourtable et reconstruire l'arborescence dans le client.

+1

Le livre de Karwin * SQL Antipatterns * est une bonne lecture sur ces sortes de des choses. –

+0

Merci, c'était une bonne lecture. Ensembles imbriqués finit par être quelque chose d'une solution idéale, même si cela complique un peu le SQL. –

+0

En outre, j'avais pensé à saisir toute la table, mais je dois aussi pouvoir saisir des branches spécifiques. –

1

besoin de plus de données .. la table ne représente-t-elle qu'un arbre ou plusieurs arbres? Si c'est un seul arbre, vous pouvez simplement sélectionner tout de la table, puis construire l'arborescence en mémoire. S'il s'agit de plusieurs arbres, vous pouvez envisager d'ajouter un treeID à chaque élément de l'arbre pour représenter l'arbre auquel appartient l'élément. Si vous cherchez à sélectionner une branche d'arbre, vous pouvez envisager de stocker des éléments avec des entiers séquentiels "classer les rangs" et des liens vers les nœuds gauche et droit, puis sélectionner tous les nœuds dans la plage entière du nœud le plus à gauche et à droite le plus le noeud.

Consultez la liste d'adjacence pour plus d'informations sur ce modèle de stockage. Vous pouvez également créer un lien hybride adjacence liste/nœud parent, car le stockage des données est si bon marché, mais vous pouvez avoir plus de liens de tri de mise à jour ...

Questions connexes