2013-09-11 6 views
0

У меня есть таблицаMultiple иерархия Mysql заявление

Таблица Отделы

Id Name Parent 1 Michael Store 0 2 Nonfood 1 3 Clothes 2 4 John Store 0 5 Shoes 2 6 Food 1 7 Men clothes 3 8 Shirts 7 9 Meat 6 10 Food 4

Как вы видите, для каждой записи у меня есть родителя который может иметь это Owen родитель. Количество разделов ограничено 5. Для элемента 8 (рубашки) вы получаете его родительский (7), что означает, что рубашки являются частью предмета с id = 7 (одежда для мужчин), часть предмета с id = 3 (одежда) , часть элемента id = 2 (непищевая), часть id = 1 (Michael Store). мне нужно заявление Mysql с на следующий результате:

Id   Name   Sub1   Sub2   Sub3   Sub4   Sub5  
1  Michael Store 
2  Michael Store Nonfood 
3  Michael Store Nonfood  Clothes 
4  John Store 
5  Michael Store Nonfood  Shoes 
6  Michael Store Food 
7  Michael Store Nonfood  Clothes  Men clothes 
8  Michael Store Nonfood  Clothes  Men clothes  Shirts 
9  Michael Store Food   Meat 
10 John Store  Food 

Спасибо за ваше время!

ответ

1

Довольно легко:

SELECT 
    d1.id, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Name, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name)+1, d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Sub1, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name)+2, d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Sub2, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name)+3, d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Sub3, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name)+4, d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Sub4, 
    ELT(FIELD(COALESCE(d6.name, d5.name, d4.name, d3.name, d2.name, d1.name), d6.name, d5.name, d4.name, d3.name, d2.name, d1.name)+5, d6.name, d5.name, d4.name, d3.name, d2.name, d1.name) AS Sub5 
FROM department d1 
LEFT JOIN department d2 ON d2.id = d1.parent 
LEFT JOIN department d3 ON d3.id = d2.parent 
LEFT JOIN department d4 ON d4.id = d3.parent 
LEFT JOIN department d5 ON d5.id = d4.parent 
LEFT JOIN department d6 ON d6.id = d5.parent 

в действии: http://sqlfiddle.com/#!2/303a5/20

+0

Мой друг, он работает! Большое спасибо!!! –

Смежные вопросы