Имеются три таблицы(отделы, рабочие ставки, рабочие):
-- отделы имеют древовидную структуру
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
Чтобы построить путь к заданному узлу в структуре 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется блок, допустим это <div class="myclass">, с этого блока я вытаскиваю заголовки:
Ищу способы формирования счёта 1С Бухгалтерии на стороне PHP, чтобы его потом можно было импортировать в программу или saas версиюВозможно ли вообще...
Когда пользователь авторизовался в админке вордпресс, то поле textarea комментариев не выводится, а если выйти из админки, то textarea нормально...