如何在mysql选择查询中使用递归
我有一个名为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 ); 此查询只提供一个级别较低的结果。我根据登录动态获取的输入值如何在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
如果您只需要两个级别—您的解决方案是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);