Заказ MySQL результатов для подчинения parent / child

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

ID NAME TYPE PARENT 1 Letters of Jane Austen book 0 2 Chapter 1 chapter 1 3 Chapter 2 chapter 1 4 Chapter 3 chapter 1 5 Title 1 title 2 6 Title 2 title 2 

Я хочу создать упорядоченную форму следующим образом:

 []Letters of Jane Austen []Chapter 1 []Title 1 []Title 2 []Chapter 2 []Chapter 3 []Another book... 

В базе данных есть много книг, а не только один.

Есть ли способ отсортировать запрос «SELECT» таким образом? Это всего лишь косметическая проблема, и ей не нужно делать многомерный массив или что-то в этом роде, потому что я могу наклеить ярлык их типом, а затем изменить внешний вид в зависимости от типа. Но мне нужно проверить запрос в правильном порядке.

PD: извините за мой английский: S

Не думайте, что это хорошая идея для базы данных. Запросы были бы трудными для него. Имо лучше – вы выбираете все книги, записываете их на страницу в порядке и просто переупорядочиваете с помощью js.

Html может быть вроде:

 <div id="books"> <div id="book_1" class="book" parent="0">Letters of Jane Austen</div> <div id="book_2" class="book" parent="1">Chapter 1</div> <div id="book_3" class="book" parent="1">Chapter 2</div> <div id="book_4" class="book" parent="1">Chapter 3</div> <div id="book_5" class="book" parent="2">Title 1</div> <div id="book_6" class="book" parent="2">Title 2</div> </div> 

Итак, js, который выполняет эту иерархию:

 $(function () { $('#books .book').each(function () { var p = $(this).attr("parent"); if ($('#book_' + p).length) { $(this).appendTo($('#book_' + p)); } }); }); 

Проверьте это на JSFiddle

Upd

И вы можете переупорядочить его на бэкэнд с помощью php, если хотите, чтобы он работал правильно с клиентами, отличными от js, но решение не будет таким красивым: D

Я, наконец, сошел с ума, но он работает, что-то вроде этого:

 select first type foreach first type __select second type where id = first type __foreach second type 

В этом типе таблицы используется так называемая модель списка адресов. Следующий запрос будет работать для вас:

 SELECT b.`id`, b.`name`, b.`type`, b.`parent` FROM `books` b LEFT JOIN `books` b2 ON b.`parent` = b2.`id` ORDER BY CASE WHEN b.`parent` = 0 THEN b.`id` ELSE b.`parent` END, b.parent;