如何在mysql选择查询中使用递归

如何在mysql选择查询中使用递归,mysql,recursion,hierarchical-data,Mysql,Recursion,Hierarchical Data,我有一个名为EmpList的MySQL表。我想使用循环来产生我期望的结果。例如,EmpList有两列 EmpNo ReportingTo ------------------- 27 14 68 14 104 27 105 27 138 27 139 68 150 8 151 8 8 5 我正在尝试使用这样的查询来获得结果 SELEC

我有一个名为EmpList的MySQL表。我想使用循环来产生我期望的结果。例如,EmpList有两列

EmpNo ReportingTo ------------------- 27 14 68 14 104 27 105 27 138 27 139 68 150 8 151 8 8 5 我正在尝试使用这样的查询来获得结果

SELECT EmpNo FROM EmpList WHERE ReportingTo IN ( SELECT DISTINCT EmpNo FROM EmpList WHERE ReportingTo = 14 ); 此查询只提供一个级别较低的结果。我根据登录动态获取的输入值


如果您只需要两个级别—您的解决方案是Union,但对于更多级别—在一个查询中没有很好的方法可以做到这一点。 您始终可以尝试使用存储过程来检索此数据

仅用于2级信息使用

SELECT EmpNo     
   FROM EmpList 
   WHERE ReportingTo=14 
UNION ALL
SELECT EmpNo
   FROM EmpList
   WHERE ReportingTo IN
       (SELECT DISTINCT EmpNo
            FROM EmpList
            WHERE ReportingTo = 14
       ); 
在Mysql中,最好使用join而不是子查询,因此查询应该是

SELECT EmpNo
 FROM EmpList
 WHERE ReportingTo =14
UNION ALL
SELECT l1.EmpNo
 FROM EmpList l1 join EmpList l2 on l1.ReportingTo=l2.EmpNo
 WHERE l2.ReportingTo =14;
试试这个

DELIMITER $$

USE `Databasename`$$

DROP PROCEDURE IF EXISTS `getlist`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `getlist`(IN empid INT)
BEGIN
      DROP TABLE IF  EXISTS finallist1;
      DROP TABLE IF  EXISTS finallist2;
          CREATE TEMPORARY TABLE IF NOT EXISTS finallist1 (empnumber INT , isread BOOL );
          CREATE TEMPORARY TABLE IF NOT EXISTS finallist2 (empnumber INT  );
          INSERT INTO finallist1 (empnumber , isread ) SELECT EmpNo , FALSE  FROM EmpList WHERE reportingTo  IN (empid);
          INSERT INTO finallist2 SELECT EmpNo  FROM EmpList WHERE reportingTo  IN (empid);
          WHILE (SELECT COUNT(*) FROM finallist1 WHERE isread = FALSE > 0 )
          DO
          INSERT INTO finallist2 SELECT EmpNo  FROM EmpList WHERE reportingTo  IN (SELECT empnumber FROM finallist1 WHERE isread = FALSE);
          UPDATE finallist1 SET isread = TRUE WHERE empnumber IN (SELECT empnumber FROM finallist2);
          END WHILE ;
          SELECT empnumber FROM finallist2 ;
    END$$

DELIMITER ;
//呼叫程序

Call getlist(empid);

Mysql不支持递归CTE,也不提供其他特定于供应商的执行递归查询的方法。请参阅Mysql中有关递归的问题。这是关于如何构造数据的。我建议您切换到嵌套的集合或闭包表。这些应该给您更多的灵活性,并允许您在一个查询中执行所需的操作。对于yu来说,这是一个很好的起点,而我认为@IanWood提到的嵌套集方法是一个很好的解决方案,另一种可能是使用递归存储过程来检索数据。就我个人而言,我会不惜一切代价避免递归,但如果解决方案和问题足够简单,那么无论如何……到目前为止,我的表数据只包含两个级别。我尝试使用存储过程以获得更好的结果。
Call getlist(empid);