Категория сортировки mysql в соответствии с идентификатором родителя

Это структура таблицы

id   parent_id   name
1    0           BMW
2    0           Mercedez
3    0           Porsche
4    1           3 Series
5    2           E60
6    1           5 Series
7    3           Cayenne

Как я могу показать таблицу как

BMW
3 Series
5 Series
Mercedez
E60
Porsche
Cayenne 

В приведенной выше таблице показан восходящий идентификатор, за которым следует parent_id, связанный с этим id, затем перейдите ко второму идентификатору и так далее. Мне нужно в одном запросе, возможно ли это сделать?

Ответ 1

Попробуйте следующее:

SELECT
  name,
  CASE WHEN parent_id = 0 THEN id ELSE parent_id END AS Sort
FROM
  cars
ORDER BY
  Sort,
  id

http://sqlfiddle.com/#!2/9b05f/3


EDIT:

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

Чтобы продемонстрировать проблему, представьте, что таблица выглядела так:

id   parent_id   name
8    0           BMW
2    0           Mercedez
3    0           Porsche
4    8           3 Series
5    2           E60
6    8           5 Series
7    3           Cayenne

Обратите внимание, что BMW имеет id 8 вместо 1. Результат будет выглядеть следующим образом:

Mercedez
E60
Porsche
Cayenne
3 Series
5 Series
BMW

Обратите внимание, что BMW отображается в нижней части списка, после его детей! Это связано с тем, что вторичные порядки сортировки на id, и если родительский идентификатор оказывается выше любых детей, родительский элемент может не отображаться поверх детей.

Этот запрос решает эту проблему:

SELECT
  name
FROM
  cars
ORDER BY
  CASE WHEN parent_id = 0 THEN id ELSE parent_id END, -- another way of writing it: ISNULL(NULLIF(parent_id, 0), id)
  parent_id,
  id

http://sqlfiddle.com/#!2/6d6d73/3

Чтобы объяснить, что происходит здесь, вы сначала заказываете родительское строку id и поле "id.

Но это не устанавливает сортировку внутри семейств, поэтому родитель может появиться где угодно внутри семьи (родитель может появиться вверху, или он может быть посередине, или он может быть последним).

Это место, в которое входят два других поля сортировки. Второе поле сортируется parent_id, а поле родительской строки parent_id всегда 0. Благополучно полагая, что поля вашего идентификатора всегда положительные, это означает, что родительская запись всегда будет отображаться сверху внутри семейства. Остальные дети будут иметь одинаковое значение для parent_id, поэтому третье поле сортировки заказывает дочерние элементы семейства в поле id. Это также можно изменить на name, в зависимости от того, как вы хотите сортировать данные.