соединение mysql не возвращает требуемый результат

#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 это дает и другим сотрудникам, которые мне не нужны