SQL, как сортировать по трем столбцам, но в древовидной структуре

База данных — Мариадб. Итак, это моя таблица, и я хочу отсортировать ее по убыванию идентификатора, но с дочерними элементами всегда ниже родителя.

+----+-----------+--------------+--------+----------+
| id | firstName | favoriteFood | status | parentID |
+----+-----------+--------------+--------+----------+
| 1  |   Andy    |    pizza     | child  |    5     |
| 2  |   Alice   |    burger    | child  |    5     |
| 3  |    Bob    |    fries     | orphan |   null   |
| 4  |  Barney   |    salad     | parent |   null   |
| 5  |  Christ   |    steak     | parent |   null   |
| 6  |  Daniel   |    pizza     | child  |    8     |
| 7  |   Mike    |    fries     | child  |    5     |
| 8  |  Richard  |   oatmeal    | parent |   null   |
| 9  |  Wilson   |    steak     | child  |    8     |
| 10 |   Dicky   |  watermelon  | orphan |   null   |
| 11 |   Freya   |    potato    | orphan |   null   |
| 12 |   Ryan    |    oyster    | parent |   null   |
| 13 |   Alex    |    bread     | orphan |   null   |
| 14 |   Sarah   |   brocoli    | child  |    12    |
| 15 |   Dane    |    toast     | child  |    8     |
+----+-----------+--------------+--------+----------+

Я попробовал это, но это не дало ожидаемого результата

SELECT * from table ORDER BY id DESC, FIELD(status,'parent','child'), parentID

и это мой ожидаемый результат, если это возможно:

+----+-----------+--------------+--------+----------+
| id | firstName | favoriteFood | status | parentID |
+----+-----------+--------------+--------+----------+
| 13 |   Alex    |    bread     | orphan |   null   |
| 12 |   Ryan    |    oyster    | parent |   null   |
| 14 |   Sarah   |   brocoli    | child  |    12    |
| 11 |   Freya   |    potato    | orphan |   null   |
| 10 |   Dicky   |  watermelon  | orphan |   null   |
| 8  |  Richard  |   oatmeal    | parent |   null   |
| 15 |   Dane    |    toast     | child  |    8     |
| 9  |  Wilson   |    steak     | child  |    8     |
| 6  |  Daniel   |    pizza     | child  |    8     |
| 5  |  Christ   |    steak     | parent |   null   |
| 7  |   Mike    |    fries     | child  |    5     |
| 2  |   Alice   |    burger    | child  |    5     |
| 1  |   Andy    |    pizza     | child  |    5     |
| 4  |  Barney   |    salad     | parent |   null   |
| 3  |    Bob    |    fries     | orphan |   null   |
+----+-----------+--------------+--------+----------+

Ожидаемый результат не имеет смысла. Я не вижу ни одного отсортированного столбца. При сортировке по id DESC сначала 15 будет помещен вверху, а 1 внизу. По чему вы сортируете, чтобы получить результат, который показываете?

Tangentially Perpendicular 16.06.2024 23:15
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Учитывая, что у вас, похоже, не более одного уровня родительского/дочернего элемента, для этого вам не нужна рекурсия. Просто отсортируйте детей по родительскому элементу, но сначала по родительскому:

select MyTbl.*
from MyTbl
order by
  coalesce(parentID,id) desc,
  parentID is not null,
  id desc

рабочий пример

Другие вопросы по теме