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