Нужна сортировка дерева

LSD^

Новичок
Нужна сортировка дерева

Имеется таблица с деревом Nested Sets и с структурой:
[cat_id] some_blob [cat_left] [cat_right] [cat_level]

Сортируем по cat_left и получаем:

.[4] Видео [5] [28] [2]
... [21] Видеодиски [6] [13] [3]
..... [33] Комедии, Мелодрамы [7] [8] [4]
..... [34] Семейное и детское кино [9] [10] [4]
..... [35] Фантастика, Мистика, Ужасы [11] [12] [4]
... [22] DVD-диски [14] [15] [3]
... [23] Видеокассеты с неигровыми записями [16] [17] [3]
... [24] Видеокассеты с зарубежными фильмами [18] [25] [3]
..... [36] Комедии, Мелодрамы [19] [20] [4]
..... [37] Семейное и детское кино [21] [22] [4]
..... [38] Фантастика, Мистика, Ужасы [23] [24] [4]
... [25] Видеокассеты с фильмами без перевода [26] [27] [3]

Можно ли как-нить отсортировать чтобы в результате было:
(тоесть чтобы вверх попало то что не имеет потомков, а потом остальное)

.[4] Видео [5] [28] [2]
... [22] DVD-диски [14] [15] [3]
... [23] Видеокассеты с неигровыми записями [16] [17] [3]
... [25] Видеокассеты с фильмами без перевода [26] [27] [3]
... [21] Видеодиски [6] [13] [3]
..... [33] Комедии, Мелодрамы [7] [8] [4]
..... [34] Семейное и детское кино [9] [10] [4]
..... [35] Фантастика, Мистика, Ужасы [11] [12] [4]
... [24] Видеокассеты с зарубежными фильмами [18] [25] [3]
..... [36] Комедии, Мелодрамы [19] [20] [4]
..... [37] Семейное и детское кино [21] [22] [4]
..... [38] Фантастика, Мистика, Ужасы [23] [24] [4]
 

su1d

Старожил PHPClubа
или
[sql]... ORDER BY IF(cat_right - cat_left = 1, 0, 1), cat_left[/sql]
т.е. вверху -- только "листья", а потом уже обычный порядок дерева.
 

LSD^

Новичок
Предложенные 2 запроса едентичны И не работают как нужно!
1) SELECT * FROM molotok ORDER BY (cat_right - cat_left) ASC, cat_left ASC
2) SELECT * FROM molotok ORDER BY IF (cat_right - cat_left = 1, 0, 1), cat_left

В результате вообще теряется и перепутана вся цепь.
Предлагаю проверить на моем тестовом дереве, дамп тут: http://limout.com/tmp/molotok_dump.zip

Давайте по другому... представим что нам нужно вывести дерево одной таблицей как тут:
http://molotok.ru/catalog/index.php?MIval=/catalog/default.app

Это легко можно сделать, если отсортировать дерево как я писал выше.

Есть возможно кривой, но вполне подходящий способ:
SELECT A. * , B. * FROM molotok A INNER JOIN molotok B ON ( ( B.cat_level = A.cat_level + 1 ) AND ( B.cat_left + 1 = B.cat_right ) AND B.cat_left BETWEEN A.cat_left AND A.cat_right ) WHERE ( A.cat_left + 1 != A.cat_right ) ORDER BY A.cat_left;

Или как можно вывести список каждого узла дерева и его листья, которые не имеют узлов поочередно?
Чтобы получить результат:

.[4] Видео [5] [28] [2]
.... [22] DVD-диски [14] [15] [3]
.... [23] Видеокассеты с неигровыми записями [16] [17] [3]
.... [25] Видеокассеты с фильмами без перевода [26] [27] [3]

.[21] Видеодиски [6] [13] [3]
.... [33] Комедии, Мелодрамы [7] [8] [4]
.... [34] Семейное и детское кино [9] [10] [4]
.... [35] Фантастика, Мистика, Ужасы [11] [12] [4]

.[24] Видеокассеты с зарубежными фильмами [18] [25] [3]
.... [36] Комедии, Мелодрамы [19] [20] [4]
.... [37] Семейное и детское кино [21] [22] [4]
.... [38] Фантастика, Мистика, Ужасы [23] [24] [4]

comments plz..
 
Сверху