2009-06-15 4 views
0

Hey, ich habe mit einem Baum in einer MySQL-Tabelle implementiert:Sorting geändert Vorordnungsdurchquerung mysql Baum

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

Dies ist das Verfahren, in dem Sie eine Tabelle wie:

+-------------+----------------------+-----+-----+ 
| 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 | 
+-------------+----------------------+-----+-----+ 

Um den Tisch wie üblich auszudrucken, würden Sie nur nach der linken Spalte sortieren. Gibt es eine einfache Möglichkeit, es umgekehrt zu bestellen, oder eine andere Spalte wie "Kosten" zu haben, wo alle Einträge derselben "Tiefe" nach Kosten geordnet sind?

Dank

Antwort

0

Die URL, die Sie zitieren zeigt, wie ein SELECT zu erhalten, die die Tiefe gibt - wenn Sie nisten, dass andere in SELECT, können Sie, wie Sie bestellen möchten. Zum Beispiel:

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; 

Ebenso natürlich, könnten Sie ein node.cost AS thecost haben auch in den inneren SELECT, bekommen es in den äußeren SELECT und ORDER BY thedepth DESC, thecost ASC oder was auch immer.

Die Leistung kann oder kann nicht anständig sein, aber Sie können wirklich nur sagen, indem Sie versuchen (und EXPLAIN SELECT und entsprechende Indizes hinzufügen ;-).

Wenn Sie eine ausreichend intelligente DB-Engine haben, brauchen Sie die Verschachtelung nicht - Sie können direkt ORDER BY eine berechnete Spalte (wie thedepth ist hier). Aber ich denke, diese Lösung würde auf mehr/älteren DB-Engines/Versionen funktionieren.

+0

Vielen Dank! –

+0

Im obigen Beispiel macht die übergeordnete Kategorie nested_category AS die gesamte Tabelle mit dem Namen "parent". Wenn ich nur einen Unterabschnitt der Tabelle haben wollte, würde ich einen dritten auswählen? Wie: (SELECT Name, links, rgt FROM Kommentare WHERE tree_id = 2) AS Eltern –

+0

Was ist "Kommentare"? Ist es die gleiche Tabelle, die ich "Knoten" nannte? Wenn ja, fügen Sie 'AND parent.tree_id = 2' am WHERE hinzu. (Übrigens, warum der Dank ohne Aufregung noch Akzeptanz? Seltsam durch normale SO-Etikette! -). –