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

时间:2012-11-28 14:21:00

标签: mysql sql inner-join

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

您在组织中拥有各种类型的用户:Junior(受到侮辱)Supervisor(受到侮辱)Manager(受到侮辱)CEO。< / p>

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

问:编写单个查询以确定Junior员工的完整组织层次结构,其中userId = 11。

示例数据:

enter image description here

答案是=&gt; 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次是可怕的,但我无法想到其他任何事情。面试官告诉我,有一种更好的方式,数据会显示columnwise。 (使用最大of 2 self joins,如果有的话)

另一种可能性是编写存储过程,但同样不是单个查询。

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:1)

根据您的评论,在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不支持这种结构。