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
请注意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)