Найти дерево иерархии родительских и дочерних элементов и их дочерних элементов - MySQL Query - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть таблица с разными именами зон с идентификаторами и их родительскими идентификаторами.Я хочу создать отчет с иерархиями.Как показано ниже.

Таблица: Группы

ID                Name              ParentID
1              Corporate               NULL
2              Zone 1                   1
3              Zone 2                   1
4              Zone 3                   1
5              Zone 4                   1
6             Telangana                 2
7             Hyderabad                 6
8             Khammam                   6
9             Odisha                    3
10            Bhubaneshwar              9

Теперь, используя таблицу выше, я хочу создать отчет.Если я выберу корпоративный, мне нужно получить все данные.Если я выберу Зону 1, мне также понадобятся все отношения с детьми. Как ниже

Зона 1, Телангана, Хайдарабад, Хаммам

Пожалуйста, помогите мне при написании запроса для этого.

Ответы [ 2 ]

0 голосов
/ 09 марта 2019

Я нашел ответ на мой вопрос выше.Это может быть достигнуто с помощью хранимой процедуры.

DELIMITER $$
DROP PROCEDURE IF EXISTS getHierarchy_proc $$
CREATE PROCEDURE getHierarchy_proc (IN GivenID INT, OUT ids VARCHAR(10000))
BEGIN
DECLARE int_check VARCHAR(1000);
DECLARE is_exit TINYINT(1) DEFAULT 0;

DROP TABLE IF EXISTS bu_tmp;
CREATE TEMPORARY TABLE bu_tmp(
bu_id INT(11) NOT NULL,
is_upd TINYINT(1) NOT NULL DEFAULT 0);

SET SESSION GROUP_CONCAT_MAX_LEN = 100000;

INSERT INTO bu_tmp (bu_id) 
SELECT GivenID;

  SET int_check = (SELECT bu_id FROM bu_tmp WHERE bu_id = GivenID AND is_upd = 0);
  SET is_exit = 1;
  REPEAT 

    IF is_exit > 0 THEN 

        INSERT INTO bu_tmp (bu_id,is_upd)
        SELECT ID,0 FROM Groups WHERE FIND_IN_SET(parent_id , int_check);
        UPDATE bu_tmp SET is_upd = 1 WHERE FIND_IN_SET(bu_id,int_check);
        SET is_exit = (SELECT COUNT(*) FROM bu_tmp WHERE is_upd = 0);
        SET int_check = (SELECT GROUP_CONCAT(bu_id) FROM bu_tmp WHERE is_upd = 0);

    END IF; 
    UNTIL is_exit = 0 END REPEAT;

SET ids = (SELECT GROUP_CONCAT(lew.le_wh_id)
         FROM bu_tmp bu JOIN legalentity_warehouses lew
         WHERE bu.bu_id = lew.bu_id
         AND lew.dc_type = 118001
         AND lew.status  = 1);       
END$$
DELIMITER ;
0 голосов
/ 13 февраля 2019

Работать с иерархическими данными в SQL довольно сложно.Я предлагаю вам использовать модель вложенных наборов и изменить вашу таблицу: добавьте left и right столбцы.Обновляйте их при добавлении, обновлении и удалении данных (это цена за легкий выбор).Когда вы это сделаете, заполучить всех детей записи №2 будет легко:

SELECT `left`, `right` FROM `table` WHERE id=2;
-- here we get $left and $right
SELECT * FROM `table` WHERE `left`>=$left AND `right` <= $right;
...