SQL - упорядочение результатов по родительскому дочернему элементу - PullRequest
2 голосов
/ 29 сентября 2011

В моей таблице товаров и категорий есть записи с идентификаторами столбцов и родителями.

допустим, у меня есть следующее

0 ----- 0 ------ home
1 ----- 4 ------ PD1
2 ----- 0 ------ CAT1
3 ----- 2 ------ PD2
4 ----- 2 ------ CAT2

первый столбец - идентификатор, второй - родитель, а в конце - заголовок.

есть ли способ (с помощью ORDER или другого метода) вернуть результаты в следующем порядке?

0 ----- 0 ------ home
    2 ----- 0 ------ CAT1
        3 ----- 2 ------ PD2
        4 ----- 2 ------ CAT2
            1 ----- 4 ------ PD1

Ответы [ 4 ]

1 голос
/ 30 сентября 2011

Попробуйте это:

SELECT id, parent, title
FROM yourtable
ORDER BY parent, id
0 голосов
/ 30 сентября 2011

Во-первых, если вы хотите сделать заказ нестандартным способом (без использования PK или алфавита в поле имени), вам нужно добавить поле для определения веса заказа различных объектов.Я бы добавил поле в таблицу, которое называется что-то вроде ordering_weight - вы не хотите использовать порядок имен полей или последовательность b / c, они являются зарезервированными словами SQL.

Во-вторых, вам нужен пункт order by:

ORDER BY top_level.ordering_weight, next_level.ordering_weight, ..., deepest_level.ordering_weight 
Заметьте, что мой порядок по пунктам приказывает сначала по самому высокому уровню моего дерева, а затем по самому низкому или самому глубокому уровню дерева.

Конечно, не обращайте внимания на вышесказанное, если все вы ищете динамичныйуровень рекурсии.

Обычно, когда я вижу такие отношения родитель-ребенок, как это, я вижу людей, желающих сделать больше, чем 1 уровень рекурсии.Проблема с вашей схемой в том, что она не поддерживает динамические уровни рекурсии, как есть.Вы можете выбрать только дочерние элементы родительского уровня, каждый дополнительный уровень требует другого соединения (есть несколько умных способов преодолеть это, но они все еще требуют дополнительного SQL для каждого уровня).

Я думаю, что может быть более полезнымВам стоит взглянуть на Модель вложенного набора , которая позволяет запрашивать бесконечные уровни рекурсии.см .: http://en.wikipedia.org/wiki/Nested_set_model

Например, следующее дерево родительско-дочерних отношений чрезвычайно сложно при использовании стандартных объединений, но очень просто при использовании модели, такой как вложенный набор.

Category A
- Category B
- - Category D
- Category E
Category F
- Category G
- - Category H
- - - Category I
- - - - Category J
0 голосов
/ 30 сентября 2011

это может быть так же просто, как

ORDER BY ParentID, ID
0 голосов
/ 30 сентября 2011

попробуйте

 SELECT * FROM yourtablename ORDER BY parentfieldname 
...