我有一个emp表,如下所示:

userID varchar(10)
ManagerID varchar(10)


数据:

UserID    ManagerID
101         102
103         102
104         103


我需要直接或间接找到经理下的所有用户。

输出应如下所示:

如果是102:

Manager     ReportingUsers
--------------------------
102           101,103


如果我们检查104,则输出应为:

Manager     ReportingUsers
--------------------------
104         102,101,103 `


我为实现此目的而编写的查询如下

SELECT managerID, GROUP_CONCAT(userID) FROM emp GROUP BY managerID;


但是我得到的输出满足第一个输出,但不满足第二个:

+-----------+----------------------+
| MANAGERID | GROUP_CONCAT(USERID) |
+-----------+----------------------+
| 102       | 101,103              |
| 104       | 102                  |
+-----------+----------------------+


如何使用游标和存储过程实现此用例,从而可以获取每个管理器的输出?

只是一个更新如果我使用下面的查询,我也可以得到第二个示例的结果,但是第一个示例的结果为102:

SELECT m.MANAGERID,  GROUP_CONCAT(m.USERID,';',(Select Group_Concat(n.USERID) from emp as n where m.userID=n.managerID or n.managerID=NULL group by n.managerID)) as ReportingUsers FROM emp as m GROUP BY managerID;


如果我可以使用游标和过程获得解决方案,那也可以。

最佳答案

您的查询是正确的,它给出了预期的输出:

mysql> select * from testdb.hierarchy;
+--------+-----------+
| userID | managerID |
+--------+-----------+
| 101    | 102       |
| 103    | 102       |
| 104    | 103       |
+--------+-----------+
3 rows in set (0.00 sec)

mysql> select managerID, group_concat(userID) from hierarchy group by managerID ;
+-----------+----------------------+
| managerID | group_concat(userID) |
+-----------+----------------------+
| 102       | 101,103              |
| 103       | 104                  |
+-----------+----------------------+
2 rows in set (0.00 sec)

08-07 07:22