2013-03-18 2 views
3

У меня есть таблица вроде этого:Результаты заказа MySQL подчиняться родителя/ребенка

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... 

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

Есть ли способ отсортировать запрос "ВЫБРАТЬ" таким образом? Это только косметическая проблема, и ей не нужно делать многомерный массив или что-то в этом роде, потому что я могу наклеить метку их типом, а затем изменить внешний вид в зависимости от типа. Но мне нужно проверить запрос в правильном порядке.

P.D: простите за мой английский: S

+1

[? Что вы пробовали] (http://www.whathaveyoutried.com/) См [советуется] (http://stackoverflow.com/questions/ask -благодаря), пожалуйста. –

+0

Я пытался сделать это из php-кода с помощью + if или foreach, но я не получил его для работы. Но я не эксперт в SQL, я думал, что будет проще принести упорядоченный запрос. –

+0

Я не эксперт по mysql, но если это был сервер sql, я бы использовал курсор в хранимой процедуре, чтобы сделать это. – Star

ответ

2

Не думаю, что это хорошая идея для базы данных. Запросы были бы трудными для него. Имо лучше - вы выбираете все книги, записываете их на страницу в порядке и просто переупорядочиваете с помощью 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

0

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

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

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

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; 
Смежные вопросы