MYSQL Создание древовидной / организационной структуры из плоской таблицы

Я пытаюсь решить эту проблему, имея ограниченные знания SQL.

У меня одна таблица с несколькими рядами сотрудников. Каждый сотрудник подчиняется MGRID. Данные могут располагаться на 7-8 уровнях, при этом сотрудник подчиняется руководителю, а менеджер - старшему. менеджер, старший от менеджера к директору и так далее.

Моя таблица выглядит так:

EMPID   NAME        MGRID
1       Alex        8
2       Jane        9
3       Bob         10
4       Shack       11
5       Chris       8
6       Sarah       10
7       James       8
8       Michelle    11
9       Ana         11  
10      Steve       11
11      Ron         NULL. <= CEO
12      Mike        3
13      Jenn        3   

Моя конечная цель - создать что-то похожее на это (многоуровневое)

Ron
    Shack
    Steve
        Bob
            Mike
            Jenn
        Sarah
    Ana
        Jane
    Michelle
        James
        Chris   
        Alex
        Chris

В настоящее время используется среда разработки mysql с версией 5.6 и локальная среда с версией 8.0.

Спасибо.

Похоже, у вас есть структура отношений внизу в вашей таблице; у вас вопрос, как вывести данные в формате, описанном выше, с помощью запроса?

Nick Suwyn 23.04.2018 17:13

@NickSuwyn Спасибо за ответ. Мой вопрос касается фактического запроса и вывода данных в новом формате, который отображается в виде иерархии / дерева.

Stangn99 23.04.2018 17:16

Может быть, есть способ сделать это, но это было бы неплохо. Этот тип вывода не является общей и не предполагаемой функцией реляционной базы данных. Как правило, вы должны написать программу для запроса базы данных, а затем вы можете перебрать результирующий набор для печати данных на консоли или в файл. Извините, я не могу помочь с вашей первоначальной конечной целью, но вы можете подумать о том, чтобы взглянуть на проблему под другим углом.

Nick Suwyn 23.04.2018 17:26

@NickSuwyn благодарит за отзыв. Я изучу некоторые другие варианты, возможно, с помощью PHP или JS, поскольку я изучаю именно эти два языка. Ценю твою поддержку!

Stangn99 23.04.2018 20:59

Без проблем. Это похоже на лучшее направление; удачи!

Nick Suwyn 23.04.2018 22:00
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
5
37
1

Ответы 1

После долгих поисков я нашел решение, которое дает результаты, которые я ищу (или, по крайней мере, очень близко к тому, что мне нужно). Я отправляю этот ответ для всех, кто может искать.

WITH RECURSIVE descendants AS
 (
  SELECT EMPID, NAME, MGRID,  1 as level 
   FROM `EMPTABLE`
    WHERE MGRID = NULL
    UNION ALL
    SELECT t.EMPID, t.NAME, t.MGRID, d.level+1
    FROM descendants d, `EMPTABLE` t
    WHERE t.MGRID = d.EMPID
    )
SELECT * FROM descendants ORDER BY level;

Это был ресурс, который я нашел https://mysqlserverteam.com/mysql-8-0-1-recursive-common-table-expressions-in-mysql-ctes-part-four-depth-first-or-breadth-first-traversal-transitive-closure- избегание цикла /

Другие вопросы по теме