Intereting Posts
MySQL подсчет различимых значений в нескольких столбцах Psycopg2 не любит имена таблиц, начинающиеся с буквы нижнего регистра SQL-запросы в Java: (JDBC) Как использовать инструкцию SELECT? При использовании DbSet <T> .SqlQuery (), как использовать именованные параметры? Выполнение подготовленных в NHibernate операторов в SQL Server Management Studio Как запросить подсчет конкретных побед команды и найти победителя серии Когда я ввожу код dateadd или датированный, я получаю эту ошибку все время «ORA-00904» DATEADD «INVALID IDENTIFIER». Может ли MySQL использовать индексы, если между условиями существует OR? Любопытная проблема с Oracle UNION и ORDER BY Подбор строки запроса MySQL SELECT Есть ли другой способ создания ограничений при создании таблицы SQL? Postgresql превращает нуль в ноль Регулярное выражение Oracle (REGEXP_LIKE) Слишком длинная ошибка – ORA-12733 Эффективное хранение 7.300.000.000 строк SQL Get Top 10 записей по дате

Категория сортировки 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, затем перейдите ко второму идентификатору и так далее. Мне нужно в одном запросе, возможно ли это сделать?

Попробуй это:

 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


РЕДАКТИРОВАТЬ:

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

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

 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 родительской строки и поле parent_id дочерних строк. Если вы закажете это, все дети будут сгруппированы вместе со своим родителем, а общий список будет упорядочен по полю id родителя.

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

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