MySql: ЗАКАЗАТЬ родителем и ребенком

У меня есть таблица вроде:

+------+---------+-
| id   | parent  |
+------+---------+
| 2043 |    NULL |
| 2044 |    2043 |
| 2045 |    2043 |
| 2049 |    2043 |
| 2047 |    NULL |
| 2048 |    2047 |
| 2043 |    2047 |
+------+---------+

который показывает простой двухуровневый "родительский-дочерний" -корреляция. Как я могу ЗАКАЗАТЬ оператором SELECT для получения порядка, как в приведенном выше списке, что означает: 1-й родительский элемент, дочерние элементы 1-го родителя, 2-й родительский элемент, дочерние элементы 2-го родителя и т.д. (Если у меня есть это, я могу добавить ORDER BYs для детей... надеюсь). Возможно ли с добавлением поля сортировки?

Ответ 1

Включение сортировки детей по id:

ORDER BY COALESCE(parent, id), parent IS NOT NULL, id

Пример скрипта SQL

Пояснение:

  • COALESCE(parent, id): Сначала сортируйте (эффективно группируя вместе) родительский идентификатор.
  • parent IS NOT NULL: Поместите родительскую строку поверх группы
  • id: Наконец, отсортируйте все дочерние элементы (один и тот же родительский элемент и parent не является нулевым)

Ответ 2

Если ваша таблица использует 0 вместо null для указания записи без родителя:

id   | parent
-------------
1233 | 0
1234 | 1233
1235 | 0
1236 | 1233
1237 | 1235

Используйте greatest вместо coalesce и проверьте, что значение не равно 0:

ORDER BY GREATEST(parent, id), parent != 0, id