Как сделать заказ по родителю, потом по ребенку? - PullRequest
11 голосов
/ 05 ноября 2011

Я пытаюсь написать свой запрос к SQL Server 2008 таким образом, чтобы при необходимости я мог просто циклически просматривать заголовки вывода и вывода. Я много раз делал это неправильно, и ColdFusion выполнял тяжелую работу на странице, но это нужно сделать в SQL Server.

FeatureID ParentID Feature
--------------------------
1         0        Apple      
2         0        Boy 
3         2        Charles
4         1        Daddy
5         2        Envelope
6         1        Frankfurter

Я хочу, чтобы мой набор результатов запроса выглядел так:

FeatureID ParentID Feature
--------------------------
1         0        Apple      
4         1        Daddy
6         1        Frankfurter
2         0        Boy 
3         2        Charles
5         2        Envelope

Если ParentID равен 0, это означает, что это основная категория. Если ParentID больше 0, это означает, что это второстепенная категория, потомок родителя.

Таким образом, родители должны быть заказаны A-Z, а дети должны быть заказаны A-Z.

Можете ли вы помочь мне правильно оформить заказ?

SELECT FeatureID, ParentID, Feature
FROM Features
ORDER BY

Ответы [ 2 ]

11 голосов
/ 05 ноября 2011

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

select  *
from    @Features feat
order by
        case 
        when ParentID = 0 
        then Feature 
        else    (
                select  Feature 
                from    @Features parent 
                where   parent.FeatureID = feat.ParentID
                ) 
        end
,       case when ParentID = 0 then 1 end desc
,       Feature
  1. Сортировка по имени корневого элемента: для корня это столбец Feature. Для детей найдите имя корня с помощью подзапроса.
  2. Сортировка корня сверху
  3. Сортировка детей по имени

Пример на данных SE.

7 голосов
/ 05 ноября 2011

для mysql, вы можете попробовать: (при условии, что ParentID вашего ребенка является FeatureID вашего ParentID)

SELECT FeatureID, ParentID, Feature
FROM Features
ORDER BY case when ParentID=0 then FeatureID else ParentID end * 1000 + FeatureID ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...