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

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

я имею

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

Решение

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

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

Измените имя таблицы в запросе, пожалуйста.

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

РЕДАКТИРОВАТЬ: На самом деле, если parent_deptid был фактическим идентификатором родителя, то вам просто нужно было бы отсортировать по parent_deptid, а затем dept_code. Однако parent_deptid выглядит не как идентификатор соответствующего родителя, а как «глубина».

РЕДАКТИРОВАТЬ 2: Извините, ваш parent_deptid выглядит нормально, просто нужно, чтобы увидеть больше данных, показывающих другие родительские идентификаторы тоже. Поэтому я пропустил это. Все что нужно отсортировать следующим образом:

SELECT *
FROM tableName
ORDER BY parent_deptid, dept_code;

РЕДАКТИРОВАТЬ 3 — В соответствии с отредактированным вопросом: вернемся к моему первоначальному предложению, изменив длину дополненной строки. Ниже приводится наиболее подходящее решение для вашей структуры данных.

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

Другие решения

Измените тип столбца 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 Privasi

Обновить

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

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

Обновление 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() ,
) ,
)

демонстрация

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

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);

Создан 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>

демонстрация

Вынесено:

  • Вадир Умум
    • багиан умум
      • кепала умум
        • СУБ багиан Ту
          • багиан умум
        • Bagian Privasi
        0
        По вопросам рекламы [email protected]