Хитрость в том, чтобы определить пользовательский параметр сортировки. Это parent
значение равно 0, мы можем просто использовать значение id
этой строки; иначе значение parent
. Это связано с тем, что значение parent
для других уровней совпадает со строкой id
для родителя.
Мы также будем использовать несколько уровней Order By
, при этом упорядочение второго уровня будет выполняться с использованием id
.
Вы можете сделать что-то вроде этого:
SELECT
id,
act,
parent,
level,
(CASE WHEN parent = 0 THEN id ELSE parent END) AS custom_sort_parameter
FROM
your_table_name
ORDER BY custom_sort_parameter, id
Я выполнил вычисление custom_sort_parameter
в предложении Select
для удобства чтения кода и облегчения понимания. Но вместо этого вы можете переместить его в предложение Order By
(чтобы избежать получения еще одного ненужного столбца). Это показано в демоверсии ниже.
Схема (MySQL v5.7)
Create table your_table_name
(id int, act int, parent int, level int);
Insert into your_table_name
VALUES (1,13,0,1),
(2,13,0,1),
(3,13,1,2),
(4,13,2,2),
(5,13,1,2);
Запрос № 1
SELECT
id,
act,
parent,
level
FROM
your_table_name
ORDER BY
CASE
WHEN parent = 0 THEN id
ELSE parent
END
, id;
| id | act | parent | level |
| --- | --- | ------ | ----- |
| 1 | 13 | 0 | 1 |
| 3 | 13 | 1 | 2 |
| 5 | 13 | 1 | 2 |
| 2 | 13 | 0 | 1 |
| 4 | 13 | 2 | 2 |
Просмотр на БД Fiddle