#mysql #sql
#mysql #sql
Вопрос:
Мои данные выглядят следующим образом,
employeeId ManagerId
3 2
4 2
2 1
5 1
6 3
У сотрудника есть менеджер, и у этого менеджера будет / может быть менеджер. Что я хотел бы сделать, так это получить менеджера сотрудника и менеджера этого менеджера, если он будет доступен.
Например, для сотрудника 6 результатом будет 3 и 2. Для сотрудника 2 это будет 1.
Ключевым требованием здесь является то, что запрос должен возвращать минимум один менеджер, если он доступен, и максимум два уровня и не выше. Пример, приведенный для employee 6, иллюстрирует это.
Прямо сейчас мой запрос выглядит так,
select a.managerId firstManager,b.ManagerId secondManager
from (
select managerId from Results where employeeId = 6 ) a
join
(select managerId from Results where employeeId in (select managerId from Results where employeeId = 6 ) )b ;
Мой запрос работает для сотрудника 6, но не для сотрудника 2. dbfiddle
Ответ №1:
Вы можете попробовать следующее — с рекурсивным cte: DEMO
with RECURSIVE t as
(
select employeeid,managerid from Results where employeeid=6
union all
SELECT e.employeeid,e.managerid from Results e inner join t t1 on e.employeeid = t1.managerid
)
select * from t order by managerid desc limit 2
Ответ №2:
Вы можете выполнить самосоединение, и вы получите требуемые результаты. dbfiddle
Select a.employeeId,
a.ManagerId First_Manager,
b.ManagerId Second_Manager
from Results a
left join Results b
on a.ManagerId = b.employeeId
Вывод:
EmployeeId First_Manager Second_Manager
3 2 1
4 2 1
2 1 null
5 1 nul
6 3 2
Комментарии:
1. точно, самосоединение — это решение!
2. закрыть, но если мне нужны результаты только для одного сотрудника. Я ставлю и.EmployeeID = 6 это дает и другим сотрудникам, которые мне не нужны