Выборка родительских отделов mysql

150
13 декабря 2018, 11:50

Имеются три таблицы(отделы, рабочие ставки, рабочие):

-- отделы имеют древовидную структуру
CREATE TABLE IF NOT EXISTS `departments` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `pid` int(11) DEFAULT NULL,
    `lavel` int(11) NOT NULL,
    `name` varchar(255) NOT NULL,
    `lefts` int(11) NOT NULL,
    `rights` int(11) NOT NULL,
    PRIMARY KEY (`id`)
);
-- вставка для примера:
INSERT INTO `departments` (`id`, `pid`, `lavel`, `name`, `lefts`, `rights`)
VALUES
    (1, 0, 1, 'Технический отдел', 1, 4),
    (2, 0, 1, 'Финансово-экономический отдел', 5, 6),
    (3, 1, 2, 'Подотдел технического отдела', 2, 3)
-- на отдел определенное количество должностей(штатное расписание)
CREATE TABLE IF NOT EXISTS `staff` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `department_id` int(11) DEFAULT NULL,
    `position_id` int(11) DEFAULT NULL
);
-- вставка для примера:
-- создаю для Подотдела технического отдела рабочее место с некоторой должностью(какой не суть)
INSERT INTO `staff` (`id`, `department_id`, `position_id`)
VALUES (1, 3, 'id какой-нибудь должности')
-- создаю для Финансово-экономического отдела рабочее место с некоторой должностью(какой не суть)
INSERT INTO `staff` (`id`, `department_id`, `position_id`)
VALUES (2, 2, 'id какой-нибудь должности')
-- таблица работников:
-- каждый работник закреплен за определенной ставкой
CREATE TABLE IF NOT EXISTS `people` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `staff_id` int(11) DEFAULT NULL,
    `lastname` varchar(80) NOT NULL,
    `firstname` varchar(80) NOT NULL,
    `fathersname` varchar(80) NOT NULL,
    `sex` varchar(1) NOT NULL,
    PRIMARY KEY (`id`)
);
-- вставка для примера:
-- принимаю работника в Технический отдел
INSERT INTO `people` (`id`, `staff_id`, `lastname`, `firstname`, `sex`)
VALUES (1, 1, 'Ivanov', 'Ivanov', 'Ivanov', 'm')
-- принимаю работника в 'Финансово-экономический отдел
INSERT INTO `people` (`id`, `staff_id`, `lastname`, `firstname`, `sex`)
VALUES (2, 2, 'Petrov', 'Petrov', 'Petrov', 'm')

Мне нужно плучить строки вида:

departments_path: 'Технический отдел / Подотел Технического отдела'
fio: 'Ivanov Ivanov Ivanov'

departments_path: 'Финансово-экономический отдел'
fio: 'Petrov Petrov Petrov'

Не могу построить departments_path вида 'отдел(/подотдел если есть)'
Версия mysql 5.0.8

Answer 1

Чтобы построить путь к заданному узлу в структуре Nested sets (вложенные множества) вам нужно выбрать всех родителей данного узла. Это делается запросом

SELECT * FROM table WHERE `left` <= :left and `right` >= :right  ORDER BY `left` 

где в :left и :right берутся з с текущего узла. Более подробно можно почитать на http://www.getinfo.ru/article610.html

Чтобы записи объединить в одно значение нужно использовать функцию GROUP_CONCAT (https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat)

Итоговый запрос:

SELECT p.lastname, (SELECT GROUP_CONCAT(name SEPARATOR '/') FROM departments d2 WHERE d2.`lefts` <= d.lefts and d2.`rights` >= d.`rights` ORDER BY `lefts`) as path
FROM people p
JOIN staff s ON s.id = p.staff_id
JOIN departments d ON d.id = s.department_id
READ ALSO
Вытащить данные из блока div

Вытащить данные из блока div

Имеется блок, допустим это <div class="myclass">, с этого блока я вытаскиваю заголовки:

142
Поле Друзей Mysql

Поле Друзей Mysql

Пишу сайт на laravelЕсть таблица (модель) user и в нем поле friends т

171
Можно ли формировать счета на оплату?

Можно ли формировать счета на оплату?

Ищу способы формирования счёта 1С Бухгалтерии на стороне PHP, чтобы его потом можно было импортировать в программу или saas версиюВозможно ли вообще...

226
Не показывается textarea комментариев

Не показывается textarea комментариев

Когда пользователь авторизовался в админке вордпресс, то поле textarea комментариев не выводится, а если выйти из админки, то textarea нормально...

173