MySQL中的分层查询。 (通过MySQL的等效连接)

时间:2017-02-16 04:23:10

标签: mysql mariadb

我在表中有三个字段,用于定义MySQL数据库中存在的层次关系。

Table Name : tb_corp
--------------------------------------------
  comp_code  | incharge_comp_Code | mngr_emp_no

     A       |                    |    111
--------------------------------------------
     B       |          A         |  
--------------------------------------------
     C       |          B         |    
--------------------------------------------

如何编写查询以获取mngr_emp_no = 111负责的所有comp_code。根据上表,111负责三家公司(A,B和C)。原因是A公司负责B公司而B公司负责C公司,因此A也负责C公司。 (A - > B)(B - > C)==(A - > C)

1 个答案:

答案 0 :(得分:0)

MySQL中没有本机分层查询支持。

对于要遍历的有限数量的级别,我们可以编写查询以获取每个级别的结果,并将结果与​​UNION ALL运算符组合。

或者,我们可以编写一个MySQL存储程序(过程)来实现更加递归的方法。

作为使用本机SQL查询的方法示例:

 SELECT t0.comp_code
   FROM tb_corp t0
  WHERE t0.mgr_emp_no = 111

 UNION ALL

SELECT t1.comp_code
  FROM tb_corp t0
  JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code
 WHERE t0.mgr_emp_no = 111

 UNION ALL

SELECT t2.comp_code
  FROM tb_corp t0
  JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code
  JOIN tb_corp t2 ON t2.incharge_comp_code = t1.comp_code
 WHERE t0.mgr_emp_no = 111

 UNION ALL

SELECT t3.comp_code
  FROM tb_corp t0
  JOIN tb_corp t1 ON t1.incharge_comp_code = t0.comp_code
  JOIN tb_corp t2 ON t2.incharge_comp_code = t1.comp_code
  JOIN tb_corp t3 ON t3.incharge_comp_code = t2.comp_code
 WHERE t0.mgr_emp_no = 111

等。这种方法可以扩展到t4,t5,t6,......到一些(合理的)有限数量的水平。

对于更加递归的方法,可以编写MySQL存储程序(PROCEDURE)。