我有一个表
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`)
)
我用填这张表
idFolder , FolderName , idFolderParent
1 ADoc Null
2 ADoc1 1
3 ADoc2 2
4 ADoc3 3
5 ADoc4 4
6 ADoc5 5
7 ADoc6 4
当选择idFolder=1的文件夹时,应返回该文件夹和子子文件夹(2、3、4、5、6、7)的所有子文件夹
当我选择一个文件夹id=4===>(5,7,6)时
当我选择一个文件夹id=3==>(4,5,6,7)时
如何通过一个查询实现这一点?
Thx
以前的解决方案都不适用于我。只有当父项按特定顺序保存到数据库中时,这两种解决方案才有效。
我不得不承认,我不完全理解查询的工作方式,但可以找到一种适合我的方法(至少比其他答案更好)。
第一次和第二次查询不起作用的数据是:
idFolder , FolderName , idFolderParent
1 ADoc Null
2 ADoc1 7
3 ADoc2 2
4 ADoc3 3
5 ADoc4 Null
6 ADoc5 5
7 ADoc6 5
如果您在此数据集中使用第一个和第二个查询,则对于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;
希望它能帮助到别人。由于缺乏声誉,我不能对其他答案发表评论或投反对票:(
这是正在工作的
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;
请查看此处的SQL FIddle:http://sqlfiddle.com/#!2/02b78/1
请注意MySQL处理
idFolderParent IN ('1, 2')
作为单个值,因此它等于:
idFolderParent IN ('1')
因此,为了对列表进行操作,您需要:
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;
(FIND_IN_SET)
select idFolder, FolderName, idFolderParent
from (select * from Folder order by idFolderParent, idFolder) folders_sorted,
(select @pv := 1) initialisation
where find_in_set(idFolderParent, @pv) > 0
and @pv := concat(@pv, ',', idFolder)
@pv:=1是您当前的文件夹id。我认为这是更好的解决方案。
Dheerendra Kulkarni的答案如下,这给了我不同校勘的错误。我希望这能帮助到别人。
非法混合排序规则(utf8_general_ci,IMPLICIT)和(utf8_unicode_ci,IMPLICIT)用于操作'='
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;
如果您不想在结果中显示主id,从查询中删除SELECT 4 Level UNION,那么它可能会起作用
SELECT GROUP_COMPAT(级别分离器',')FROM(SELECT 4级别活接头SELECT@Ids:=(SELECT GROUP_CONCT(idFolder
分离器',')FROM folder
WHERE FIND_IN_SET(idFolderParent
,@Ids))级别来自folder
加入(SELECT@Ids:=4)temp1)temp2
请查看此处的SQL FIddle:http://sqlfiddle.com/#!9/a2b4b3/312
要获得特定父级的所有级别的子级,可以使用以下查询:
select idFolder from (select * from Folder order by idFolderParent, idFolder) Folder, (select @pv := '1') initialisation where find_in_set(idFolderParent, @pv) > 0 and @pv := concat(@pv, ',', idFolder )