2009-06-15 13 views
0

Hey, j'ai mis en place un arbre dans une table MySQL avec:Le tri arbre pré-commande traversal mysql modifié

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Ceci est la méthode où vous avez une table comme:

+-------------+----------------------+-----+-----+ 
| category_id | name     | lft | rgt | 
+-------------+----------------------+-----+-----+ 
|   1 | ELECTRONICS   | 1 | 20 | 
|   2 | TELEVISIONS   | 2 | 9 | 
|   3 | TUBE     | 3 | 4 | 
|   4 | LCD     | 5 | 6 | 
|   5 | PLASMA    | 7 | 8 | 
|   6 | PORTABLE ELECTRONICS | 10 | 19 | 
|   7 | MP3 PLAYERS   | 11 | 14 | 
|   8 | FLASH    | 12 | 13 | 
|   9 | CD PLAYERS   | 15 | 16 | 
|   10 | 2 WAY RADIOS   | 17 | 18 | 
+-------------+----------------------+-----+-----+ 

Pour imprimer la table comme d'habitude, vous devez simplement commander par la colonne lft. Y at-il un moyen facile de le commander en sens inverse, ou d'avoir une autre colonne comme "coût" où toutes les entrées de la même "profondeur" sont classés par coût?

Merci

Répondre

0

L'URL citation montre comment obtenir un SELECT qui donne la profondeur - si vous nid dans un autre SELECT, vous pouvez commander comme vous préférez. Par exemple:

SELECT thename, thedepth 
FROM (
    SELECT node.name AS thename, (COUNT(parent.name) - 1) AS thedepth 
    FROM nested_category AS node, 
    nested_category AS parent 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
    GROUP BY node.name 
    ORDER BY node.lft) plain 
ORDER BY thedepth DESC; 

De même, bien sûr, vous pourriez avoir un node.cost AS thecost aussi bien dans le SELECT intérieur, obtenir dans le SELECT extérieur et ORDER BY thedepth DESC, thecost ASC ou autre.

Les performances peuvent être décentes ou pas, mais vous pouvez vraiment dire seulement en essayant (et EXPLAIN SELECT et en ajoutant des indices appropriés ;-).

Si vous avez un moteur de base de données suffisamment intelligent, vous n'avez pas besoin de l'imbrication - vous pouvez directement ORDER BY une colonne calculée (comme thedepth est ici). Mais je pense que cette solution fonctionnerait sur des moteurs/versions de DB plus/plus anciens.

+0

Merci beaucoup! –

+0

Dans l'exemple ci-dessus, nested_category AS parent crée la table entière nommée "parent". Si je voulais seulement une sous-section de la table, est-ce que j'utiliserais un troisième select? Comme: (SELECT nom, gauche, rgt FROM commentaires WHERE tree_id = 2) AS parent –

+0

Qu'est-ce que c'est «commentaires»? est-ce la même table que j'ai appelée "node"? Si c'est le cas, il vaut mieux ajouter 'AND parent.tree_id = 2' à WHERE. (btw, pourquoi les remerciements sans upvote ni acceptation? bizarre par l'étiquette SO normal!). –