Mysql选择递归获取具有多个级别的所有子级

14 mysql

我有一张桌子

 CREATE TABLE IF NOT EXISTS `Folder` (
    `idFolder` INT(11) NOT NULL AUTO_INCREMENT,
    `FolderName` VARCHAR(150) NOT NULL,
    `idFolderParent` INT(11) NULL,
    PRIMARY KEY (`idFolder`),
    CONSTRAINT `fk_1`
    FOREIGN KEY (`idFolderParent`)
    REFERENCES `Folder` (`idFolder`)
)
Run Code Online (Sandbox Code Playgroud)

我填写这张表

idFolder , FolderName , idFolderParent
   1           ADoc           Null  
   2           ADoc1           1  
   3           ADoc2           2
   4           ADoc3           3
   5           ADoc4           4
   6           ADoc5           5
   7           ADoc6           4
Run Code Online (Sandbox Code Playgroud)

当选择idFolder = 1的文件夹时,应该返回该文件夹和子文件夹的所有子文件夹(2,3,4,5,6,7)

当我选择文件夹id = 4 ==>(5,7,6)

当我选择文件夹id = 3 ==>(4,5,6,7)

如何使用一个查询?

谢谢

Adr*_*n E 19

以前的解决方案都不适合我.只有父母按特定顺序保存到数据库中时,两者才有效.

我不得不承认我不完全理解查询的工作方式,但可以找到适合我的方法(至少比其他答案更好).

第一个和第二个查询不起作用的数据是:

idFolder , FolderName , idFolderParent
   1           ADoc           Null  
   2           ADoc1           7  
   3           ADoc2           2
   4           ADoc3           3
   5           ADoc4          Null
   6           ADoc5           5
   7           ADoc6           5
Run Code Online (Sandbox Code Playgroud)

如果您在此数据集中使用第一个和第二个查询,则对于id 5,您只能获得结果'6,7'.但如果您使用我的查询,您会得到:'6,7,2,3,4',这是预期的结果.

我的版本:

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder 
WHERE FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder 
JOIN
(SELECT @pv:=5) tmp
) a;
Run Code Online (Sandbox Code Playgroud)

希望它可以帮助某人.由于缺乏声誉,我无法发表评论或推翻其他答案:(


Dhe*_*rni 12

这是工作的

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder WHERE idFolderParent IN (@pv)) AS lv FROM Folder
JOIN
(SELECT @pv:=1)tmp
WHERE idFolderParent IN (@pv)) a;
Run Code Online (Sandbox Code Playgroud)

在这里查看SQL FIddle:http://sqlfiddle.com/#!022b78/1


asc*_*eta 6

请注意MySQL对待

idFolderParent IN ('1, 2')
Run Code Online (Sandbox Code Playgroud)

作为单个值,所以它等于:

idFolderParent IN ('1')
Run Code Online (Sandbox Code Playgroud)

所以为了在列表上操作,你需要:

SELECT GROUP_CONCAT(lv SEPARATOR ',') FROM (
SELECT @pv:=(SELECT GROUP_CONCAT(idFolder SEPARATOR ',') FROM Folder WHERE
FIND_IN_SET(idFolderParent, @pv)) AS lv FROM Folder
JOIN (SELECT @pv:=1)tmp
WHERE idFolderParent IN (@pv)) a;
Run Code Online (Sandbox Code Playgroud)

(FIND_IN_SET)

  • 但仍然没有给出完美的结果. (2认同)
  • 最后一行应该是"WHERE FIND_IN_SET(idFolderParent,@ pv)a;" (2认同)