Сортировка модифицированного дерева MySQL обхода предварительного порядка

Привет, я реализовал дерево в таблице 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. Есть ли какой-нибудь простой способ упорядочить его в обратном порядке или создать другой столбец, например «стоимость», где все записи одной и той же «глубины» упорядочены по стоимости?

Спасибо


person Community    schedule 15.06.2009    source источник


Ответы (1)


Цитируемый вами 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 здесь). Но я думаю, что это решение будет работать на более старых двигателях / версиях БД.

person Alex Martelli    schedule 15.06.2009
comment
В приведенном выше примере родительский элемент nested_category AS создает всю таблицу с именем parent. Если бы мне нужен был только подраздел таблицы, использовал бы я третий выбор? Как: (ВЫБЕРИТЕ имя, слева, rgt FROM комментариев WHERE tree_id = 2) как родительский - person ; 15.06.2009
comment
Какие комментарии? это та же таблица, которую я назвал узлом? Если это так, лучше всего добавить «AND parent.tree_id = 2» к WHERE. (Кстати, почему благодарность без одобрения и принятия? Странно по нормальному этикету ТАК! -). - person Alex Martelli; 15.06.2009