Порядок выбора строк по нескольким столбцам - PullRequest
5 голосов
/ 21 февраля 2011

У меня есть база данных

id    |     parentid     |       name
1     |        0         |      CatOne
2     |        0         |      CatTwo
3     |        0         |      CatThree
4     |        1         |      SubCatOne
5     |        1         |      SubCatOne2
6     |        3         |      SubCatThree

Как я могу выбрать эту кошку Заказать По id, parentid?То есть

CatOne 1
--SubCatOne 4
--SubCatOne2 5
CatTwo 2
CatThree 3
--SubCatThree 6

Ответы [ 5 ]

5 голосов
/ 21 февраля 2011

при условии, что ваша таблица названа котами, попробуйте это:

select * from  cats
order by
      case when parentid = 0 then id else parentid end,
      case when parentid = 0 then 0 else id end

Обновлен, чтобы включить, когда родитель будет иметь более высокий идентификатор по сравнению с детьми

3 голосов
/ 21 февраля 2011

Это должно сделать это ... за исключением двойного тире "-" префикс к имени ...

SELECT 
      t1.name,
      t1.id
   FROM 
      Table1 t1
   ORDER BY 
      case when t1.parentID = 0 then t1.ID else t1.ParentID end,
      case when t1.parentID = 0 then '1' else '2' end,
      t1.id

Порядок в первом случае / когда все элементы, которые являются верхним уровнем, или на вторичном уровне по идентификатору первичного уровня. Поэтому попытка использовать предложенный родительский взлом * 1000 не будет проблемой, если у вас более 1000 записей. Второй случай / когда будет принудительно установлен, когда родительский идентификатор = 0 в ТОП своего сгруппированного списка и всех его вспомогательных записей ПОД, но перед следующим родительским идентификатором.

однако, если вы действительно хотите двойную черту, измените на

SELECT 
      if( t1.ParentID = 0, '', '--' ) + t1.name name,
     <rest of query is the same>
1 голос
/ 21 февраля 2011

Это:

select id as parentId,
0 as sortOrder,
id,
name
from cats 
where parentId = 0
union all
select parentId,
1 as sortOrder,
id,
name
from cats 
where parentId > 0
order by parentId, sortOrder, name

Возвращает:

ParentId sortOrder  id   Name
    1       0       1   CatOne
    1       1       4   SubCatOne
    1       1       5   SubCatOne2
    2       0       2   CatTwo
    3       0       3   CatThree
    3       1       6   SubCatThree
1 голос
/ 21 февраля 2011

Если бы вы сортировали по: ORDER BY parentid, id

, вы бы получили искомый заказ, но он не был бы предназначен или что-то подобное, как в вашем примере.

SQL, вероятно, не лучший способ для создания такой группы с отступами.Вы можете ... но это лучше сделать в вашем внешнем приложении

edit: извините, неправильно прочитанный вопрос, что сказал Эрик Petroelje.

edit edit: или выбрать из таблицы, присоединиться к себе, (один для Cat и один для SubCat), а затем укажите другой порядок, по одному из каждой таблицы.

0 голосов
/ 21 февраля 2011

Вы можете попробовать это. Это не совсем тот формат, который вы указали, но он соответствует тому, что вам требуется?

SELECT c.id,c.name,sc.id as subcatid,sc.name as subcatname
FROM cats c LEFT JOIN cats sc ON c.id=sc.parentid
WHERE c.parentid=0 order by c.id,sc.id;

Производит следующее:

+------+----------+----------+-------------+
| id   | name     | subcatid | subcatname  |
+------+----------+----------+-------------+
|    1 | CatOne   |        4 | SubCatOne   |
|    1 | CatOne   |        5 | SubCatOne2  |
|    2 | CatTwo   |     NULL | NULL        |
|    3 | CatThree |        6 | SubCatThree |
+------+----------+----------+-------------+
...