2016-05-16 5 views
-1

Я смущен. Я не знаю, как создать древовидное представление в MySQL с помощью хранимой процедуры. Я попытался выполнить поиск в Google, и я не понимаю, как запросить.Как создать древовидную структуру в mysql с помощью хранимой процедуры

У меня есть

deptid | dept_code | dept_name | parent_deptid 
    1    1 wadir Umum   0 
    2   101 bagian umum   1 
    3   10101 kepala umum   2 
    4   102 bagian privasi  1 
    5  1010101 SUb bagian Tu   3 
    6  1010102 bagian umum   3 

, и я хочу, чтобы это сделать, как этот

deptid | dept_code | dept_name | parent_deptid 
    1    1 wadir Umum    0 
    2   101 -bagian umum    1 
    3   10101 --kepala umum    2 
    5  1010101 ---Sub bagian Tu   3 
    6  1010102 ---bagian umum   3 
    4   102 -bagian privasi   1 
+1

Какова структура данных? Каков ваш запрос? – gfelisberto

+0

Почему * deptid = 5 * упорядочен после * deptid = 6 *, когда его родитель равен 3? –

+0

извините, мой фальшивый отредактировал –

ответ

0

Поскольку код отдела картина выглядит удобно, я не проводил время на parent_id. Согласно вашему шаблону кода отдела, следующее должно помочь.

Просто введите код департамента и получите отсортированные одинаковые коды.

Измените ваше имя таблицы в запросе.

SELECT * 
FROM tableName 
ORDER BY RPAD(dept_code, 5, '0') 

EDIT: На самом деле, если parent_deptid был идентификатор фактического родителя, то вы бы просто нужно сортировать parent_deptid, затем dept_code. Тем не менее, parent_deptid не похож на идентификатор соответствующего родителя, а вместо него что-то вроде «глубина».

EDIT2: Извините, ваш parent_deptid выглядит нормально, просто нужно увидеть больше данных, отображающих другие идентификаторы родителей. Поэтому я пропустил это. Все, что вам нужно сортировать следующим образом:

SELECT * 
FROM tableName 
ORDER BY parent_deptid, dept_code; 

EDIT3 - По отредактированному вопросу: Назад к моему первоначальному предложению, изменив проложенную длину строки - После является наиболее подходящим решением для вашей структуры данных.

SELECT * 
FROM tableName 
ORDER BY RPAD(dept_code, 10, '0') 
  • 10 может быть максимальная длина вашего dept_code.
+0

okay я попробую его –

+0

@HardianZ: посмотри мои правки. – smozgur

+0

см. Мои новые изменения –

0

Chnage ваш dept_code тип столбца VARCHAR и использовать следующий запрос

SELECT * 
FROM tableName 
ORDER BY dept_code 
0

Следующий запрос создаст выход разметки:

SELECT group_concat(
    CONCAT(
    REPEAT(' ', (CHAR_LENGTH(t.dept_code) - 1)/2), 
    '- ', 
    t.dept_name 
) 
    ORDER BY t.dept_code 
    SEPARATOR '\n' 
) AS markup 
FROM Table1 t 

sqlfiddle

Результат:

- wadir Umum 
    - bagian umum 
     - kepala umum 
      - SUb bagian Tu 
     - bagian umum 
    - bagian privasi 

Будет оказана:

  • Вадир Умум
    • bagian Умум
      • kepala Умум
        • SUb bagian Ту
      • bagian Умум
    • bagian privasi

Update

Чтобы соответствовать обновление вопрос:

SELECT t.*, 
    CHAR_LENGTH(t.dept_code) - CHAR_LENGTH(REPLACE(t.dept_code, '0', '')) AS indent, 
    CONCAT(
    REPEAT('-', CHAR_LENGTH(t.dept_code) - CHAR_LENGTH(REPLACE(t.dept_code, '0', ''))), 
    t.dept_name 
) AS indented_name 
FROM Table1 t 
ORDER BY t.dept_code 

sqlfiddle

Обновление 2

Преимущества вашего дизайна в том, что для таких задач вам не нужна хранимая процедура. См. dept_code как полный путь дерева с 0 как разделитель. 1010102 также может быть написана как 1/1/1/2. Если вы правильно спроектировали, вы можете просто заказать по dept_code. Чтобы получить глубину узла, вам просто нужно подсчитать разделитель (0) на пути (dept_code).

Update 3

Если вы хотите создать рекурсивную структуру, то лучше делать на процедурном языке, как PHP:

магазин SQL результат от простого запроса (SELECT * FROM depts) в массив , который будет выглядеть так:

// result from query: SELECT * FROM depts 
$depts = array(
    array(// row #0 
     'deptid' => 1, 
     'dept_code' => '1', 
     'dept_name' => 'wadir Umum', 
     'parent_deptid' => 0, 
    ), 
    array(// row #1 
     'deptid' => 2, 
     'dept_code' => '101', 
     'dept_name' => 'bagian umum', 
     'parent_deptid' => 1, 
    ), 
    array(// row #2 
     'deptid' => 3, 
     'dept_code' => '10101', 
     'dept_name' => 'kepala umum', 
     'parent_deptid' => 2, 
    ), 
    array(// row #3 
     'deptid' => 4, 
     'dept_code' => '102', 
     'dept_name' => 'bagian privasi', 
     'parent_deptid' => 1, 
    ), 
    array(// row #4 
     'deptid' => 5, 
     'dept_code' => '1010101', 
     'dept_name' => 'SUb bagian Tu', 
     'parent_deptid' => 3, 
    ), 
    array(// row #5 
     'deptid' => 6, 
     'dept_code' => '1010102', 
     'dept_name' => 'bagian umum', 
     'parent_deptid' => 3, 
    ), 
); 

построить рекурсивную структуру с двумя foreach петлями:

$nodes = array(); 
$roots = array(); 

// init nodes 
foreach ($depts as $dept) { 
    $dept['childs'] = array(); // init childs 
    $nodes[$dept['deptid']] = $dept; 
} 

foreach ($depts as $dept) { 
    if ($dept['parent_deptid'] == 0) { 
     $roots[] = $dept['deptid']; // add root 
    } else { 
     $nodes[$dept['parent_deptid']]['childs'][] = $dept['deptid']; // add to parents chlids list 
    } 
} 

Массивы $roots и $nodes будет выглядеть следующим образом:

$roots = array (0 => 1,); 
$nodes = array(
    1 => array(
     'deptid' => 1, 
     'dept_code' => '1', 
     'dept_name' => 'wadir Umum', 
     'parent_deptid' => 0, 
     'childs' => array(
      0 => 2, 
      1 => 4, 
     ) , 
    ) , 
    2 => array(
     'deptid' => 2, 
     'dept_code' => '101', 
     'dept_name' => 'bagian umum', 
     'parent_deptid' => 1, 
     'childs' => array(
      0 => 3, 
     ) , 
    ) , 
    3 => array(
     'deptid' => 3, 
     'dept_code' => '10101', 
     'dept_name' => 'kepala umum', 
     'parent_deptid' => 2, 
     'childs' => array(
      0 => 5, 
      1 => 6, 
     ) , 
    ) , 
    4 => array(
     'deptid' => 4, 
     'dept_code' => '102', 
     'dept_name' => 'bagian privasi', 
     'parent_deptid' => 1, 
     'childs' => array() , 
    ) , 
    5 => array(
     'deptid' => 5, 
     'dept_code' => '1010101', 
     'dept_name' => 'SUb bagian Tu', 
     'parent_deptid' => 3, 
     'childs' => array() , 
    ) , 
    6 => array(
     'deptid' => 6, 
     'dept_code' => '1010102', 
     'dept_name' => 'bagian umum', 
     'parent_deptid' => 3, 
     'childs' => array() , 
    ) , 
) 

Demo

Теперь вы можете написать какую-рекурсивную функцию, чтобы ходить по дереву:

function getSubtreeHTMLList($deptsids, $nodes) { 
    $result = '<ul>'; 
    foreach ($deptsids as $deptsid) { 
     $result .= '<li>'; 
     $result .= $nodes[$deptsid]['dept_name']; 
     if (count($nodes[$deptsid]['childs'] > 0)) { 
      $result .= getSubtreeHTMLList($nodes[$deptsid]['childs'], $nodes); 
     } 
     $result .= '</li>'; 
    } 
    $result .= '</ul>'; 
    return $result; 
} 

echo getSubtreeHTMLList($roots, $nodes); 

Created HTML :

<ul><li>wadir Umum<ul><li>bagian umum<ul><li>kepala umum<ul><li>SUb bagian Tu<ul></ul></li><li>bagian umum<ul></ul></li></ul></li></ul></li><li>bagian privasi<ul></ul></li></ul></li></ul> 

Demo

Rendered:

  • Вадир Умум
    • bagian Умум
      • kepala Умум
        • SUb bagian Ту
          • bagian Умум
        • bagian privasi
        +0

        не получилось результат - wadir umum - bagian umum -kepala umum -sub bagian tu –

        +0

        Вам нужно показать его в текстовом формате. Используйте раскрывающееся меню рядом с кнопкой «Запустить SQL». –

        +0

        ok работать в sql-fidle, но я до сих пор не понимаю с помощью открытого текста, когда хочу запросить с помощью php и показать его в таблице, я использую SP call treeview –

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