Mysql 使用单个查询确定用户的组织层次结构

Mysql 使用单个查询确定用户的组织层次结构,mysql,sql,inner-join,Mysql,Sql,Inner Join,这是我最近在一次采访中被问到的一个问题: 组织中有各种类型的用户:Junior(由主管领导)主管(由经理领导)首席执行官 我们同意这个简化的表模式。用户:{userId,userName,UserType(J,S,M,C),bossUserId} Q:编写一个查询,以确定userId=11的初级员工的完整组织层次结构 样本数据: 答案是=>PQR2-->GHI2-->DEF1-->ABC1 这就是我的解决方案: select e1.userName, e2.userName, e3.userN

这是我最近在一次采访中被问到的一个问题:

组织中有各种类型的用户:
Junior
(由主管领导)
主管
(由经理领导)
首席执行官

我们同意这个简化的表模式。用户:
{userId,userName,UserType(J,S,M,C),bossUserId}

Q:编写一个查询,以确定userId=11的
初级员工的完整组织层次结构

样本数据:

答案是=>
PQR2-->GHI2-->DEF1-->ABC1

这就是我的解决方案:

select e1.userName, e2.userName, e3.userName, e4.userName from 
abc e1 inner join users e2 on e1.bossUserId = e2.userId
inner join users e3 on e2.bossUserId = e3.userId
inner join users e4 on e3.bossUserId = e4.userId
where e1.userId = 11;
我确实意识到,4次自我连接是可怕的,但我想不出其他任何东西。采访者告诉我有一种更好的方法,数据将以列方式显示。(如果有的话,最多使用两个自联接

另一种可能是编写一个存储过程,但它不是一个单一的查询


有人能帮我吗?

根据您的评论,在MS SQL(以及其他类似的语言)中,您可以这样做

;with cte as (
    select *, 0 as level from yourtable
    union all 
    select cte.id, t2.name, t2.ut, t2.bossid, level+1
    from cte
        inner join yourtable t2 on cte.bossid = t2.id
)
    select name, ut from cte
    where id=11
    order by level
这给了你

pqr2    j
ghi2    s
def1    m
abc1    c

但是MySQL不支持这种构造。

在您的评论之后,在MS SQL(以及其他类似的)中,您可以这样做

;with cte as (
    select *, 0 as level from yourtable
    union all 
    select cte.id, t2.name, t2.ut, t2.bossid, level+1
    from cte
        inner join yourtable t2 on cte.bossid = t2.id
)
    select name, ut from cte
    where id=11
    order by level
这给了你

pqr2    j
ghi2    s
def1    m
abc1    c

但是MySQL不支持这种结构。

如果你能通过它会对你有很大帮助,那会更好。这是专门针对MySQL的问题,还是针对一般SQL变体的问题?@TJ-MySQL没有递归查询。使用关联列表,您将永远无法通过单个联接获得层次结构的四层。我认为要么面试官吓唬了你,要么不是为了MySQL(Oracle、PostGreSQL、MS SQL Server等,都可以通过递归查询实现这一点。)SashiKant谢谢。我去看看@我想是的。我告诉他我有使用mySQL的经验,然后他问了这个问题。但非mySql解决方案也会对我有所帮助。@TJ-面试官要问的一个强烈问题是
哪种RDBMS或哪种ANSI-SQL标准?这个问题的限制条件是什么?
如果你能仔细研究一下会更好,这对你会有很大帮助。这个问题是专门针对MYSQL的,还是针对一般SQL变体的?@TJ-MYSQL没有递归查询。使用关联列表,您将永远无法通过单个联接获得层次结构的四层。我认为要么面试官吓唬了你,要么不是为了MySQL(Oracle、PostGreSQL、MS SQL Server等,都可以通过递归查询实现这一点。)SashiKant谢谢。我去看看@我想是的。我告诉他我有使用mySQL的经验,然后他问了这个问题。但非mySql解决方案也会对我有所帮助。@TJ-面试官要问的一个强烈问题是
哪种RDBMS或哪种ANSI-SQL标准?这个问题的限制条件是什么?