2009-06-15 2 views
0

Эй, я реализовал дерево в таблице тузда с помощью:Сортировку модифицированы обход MySQL дерево

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

Это метод, в котором у вас есть таблица, как:

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

Чтобы распечатать таблицу, как обычно, вы просто закажете столбец lft. Есть ли простой способ заказать его в обратном порядке или иметь другой столбец типа «стоимость», где все записи одной и той же «глубины» упорядочены по стоимости?

Благодаря

ответ

0

URL, вы цитируете показывает, как получить SELECT, что дает глубину - если гнездо, что в другой SELECT, вы можете заказать, как вы предпочитаете. Например:

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; 

Точно так же, конечно, вы могли бы иметь node.cost AS thecost, а во внутреннем SELECT, получить его во внешнем SELECT и ORDER BY thedepth DESC, thecost ASC или любой другой.

Производительность может быть или не быть приличной, но вы действительно можете сказать только путем попытки (и EXPLAIN SELECT и добавления соответствующих индексов ;-).

Если у вас достаточно интеллектуальный механизм БД, вам не нужна вложенность - вы можете непосредственно ORDER BY вычисленный столбец (как здесь thedepth). Но я думаю, что это решение будет работать на более/более старых версиях/версиях БД.

+0

спасибо! – 2009-06-15 00:23:03

+0

В приведенном выше примере родительский элемент nested_category AS создает всю таблицу с именем «parent». Если бы мне нужен только подраздел в таблице, я бы использовал третий выбор? Вроде: (SELECT name, left, rgt FROM comments WHERE tree_id = 2) AS parent – 2009-06-15 00:28:35

+0

Что такое «комментарии»? это та же самая таблица, которую я назвал «узлом»? Если это так, лучше всего добавить 'AND parent.tree_id = 2' в WHERE. (кстати, почему благодарность без поддержки или принятия? странно по нормальному SO этикету!). –

Смежные вопросы