MySQL 表示 子-父-祖父关系

备注:测试数据库版本为MySQL 8.0

如需要scott用户下建表及录入数据语句,可参考:
scott建表及录入数据sql脚本

一.需求

员工CLARK为KING工作,假设员工CLARK又是另一个员工的经理,怎么办?

select ename,empno,mgr
from emp
where ename in (‘KING’,‘CLARK’,‘MILLER’);
±-------±------±-----+
| ename | empno | mgr |
±-------±------±-----+
| CLARK | 7782 | 7839 |
| KING | 7839 | NULL |
| MILLER | 7934 | 7782 |
±-------±------±-----+

可以看到,员工MILLER为CLARK工作,而CLARK又为KING工作。
现在需要表示从 MILLER到KING的完整层次。

返回下列结果集:
±----------------------+
| leaf_branch_root |
±----------------------+
| MILLER–>CLARK–>KING |
±----------------------+

二.解决方案

对表EMP进行两次自联接,返回MILLER、MILLER的经理CLARK、CLARK的经理KING.

select  concat(a.ename,'-->',b.ename,'-->',c.ename) as leaf_branch_root
  from  emp a, emp b, emp c
 where  a.ename = 'MILLER'
   and  a.mgr = b.empno
   and  b.mgr = c.empno;

测试记录:

mysql> select  concat(a.ename,'-->',b.ename,'-->',c.ename) as leaf_branch_root
    ->   from  emp a, emp b, emp c
    ->  where  a.ename = 'MILLER'
    ->    and  a.mgr = b.empno
    ->    and  b.mgr = c.empno;
+-----------------------+
| leaf_branch_root      |
+-----------------------+
| MILLER-->CLARK-->KING |
+-----------------------+
1 row in set (0.00 sec)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值