您的输出规范导致我所做的版本略有不同。
假设您没有任何“循环”,并且没有任何 mgtuserId = userId 的行,您可以通过多次将表连接到自身来模拟层次查询 N 级,如下所示:
SELECT n0.userId AS n0_userId
, n1.userId AS n1_userId
, n2.userId AS n2_userId
, n3.userId AS n3_userId
, n4.userId AS n4_userId
, n5.userId AS n5_userId
, n6.userId AS n6_userId
FROM mytable n0
LEFT JOIN mytable n1 ON n1.mgtuserId = n0.userId
LEFT JOIN mytable n2 ON n2.mgtuserId = n1.userId
LEFT JOIN mytable n3 ON n3.mgtuserId = n2.userId
LEFT JOIN mytable n4 ON n4.mgtuserId = n3.userId
LEFT JOIN mytable n5 ON n5.mgtuserId = n4.userId
LEFT JOIN mytable n6 ON n6.mgtuserId = n5.userId
WHERE n0.userId = 1
但是此查询不会返回您指定的结果集,即逗号分隔的列表。
此查询返回的每一行代表树下的“路径”,从指定的起点到每个叶节点(或者,在这种情况下,到每个深度不超过六层的节点(低于指定的起点)。
不,它不漂亮。但是您可以看到如何将其扩展到 N 个级别。
现在,我看不到将其转换为您指定的结果集的好方法。
我可能必须做同样的事情,但是使用单独的查询(一层深,两层深等)获取每个级别,然后使用 UNION ALL 将它们组合起来。但这会更难看。
为了得到每个叶节点的未指定数量的级别,我们确实需要使用一个临时表,并迭代地执行相同类型的查询。但当然,这不是一个单一的查询。
(我将研究一个返回您指定结果集的解决方案。)