Mysql select recursive obtener todos los niños con múltiples niveles

tengo una mesa

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`) ) 

Lleno esta tabla

 idFolder , FolderName , idFolderParent 1 ADoc Null 2 ADoc1 1 3 ADoc2 2 4 ADoc3 3 5 ADoc4 4 6 ADoc5 5 7 ADoc6 4 

cuando seleccione una carpeta con idFolder = 1, se debe devolver todo el contenido secundario para esta carpeta y carpeta secundaria (2, 3, 4, 5, 6, 7)

Cuando selecciono una carpeta id = 4 ==> (5,7, 6)

Cuando selecciono una carpeta id = 3 ==> (4, 5,6, 7)

¿Cómo hacer eso con una consulta?

Gracias

Aquí está el trabajo

 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; 

Mire SQL FIddle aquí: http://sqlfiddle.com/#!2/02b78/1

Ninguna de las soluciones anteriores funcionó para mí. Ambos solo funcionan si los padres se guardan en la base de datos en un orden determinado.

Tengo que admitir que no entiendo completamente la forma en que funciona la consulta, pero que podría encontrar una manera que me funcione (al menos mejor que las otras respuestas).

Los datos con los que no funcionan la primera y la segunda consulta son:

 idFolder , FolderName , idFolderParent 1 ADoc Null 2 ADoc1 7 3 ADoc2 2 4 ADoc3 3 5 ADoc4 Null 6 ADoc5 5 7 ADoc6 5 

Si usa la primera y la segunda consulta en este conjunto de datos, para la ID 5 solo obtendrá como resultado ‘6,7’. Pero si usa mi consulta, obtiene: ‘6,7,2,3,4’, que es el resultado esperado.

Mi version:

 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; 

Espero que ayude a alguien. No puedo comentar ni rechazar las otras respuestas por falta de reputación 🙁

Tenga en cuenta que MySQL trata el

 idFolderParent IN ('1, 2') 

como un valor único, por lo que es igual a:

 idFolderParent IN ('1') 

entonces, para operar en la lista, necesita:

 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 es su ID de Carpeta actual. Creo que esta es una solución mucho mejor.

La respuesta de Dheerendra Kulkarni que está debajo me da este error para diferentes colaciones. Espero que esto ayude a alguien.

Mezcla ilegal de intercalaciones (utf8_general_ci, IMPLICIT) y (utf8_unicode_ci, IMPLICIT) para la operación ‘=’

 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; 

Puede ser que funcione si no quieres ID principal en el resultado eliminar SELECT 4 Level UNION de consulta

SELECCIONE GROUP_CONCAT (SEPARATOR de nivel ‘,’) FROM (SELECT 4 Level UNION SELECT @Ids: = (SELECT GROUP_CONCAT ( idFolder SEPARATOR ‘,’) DESDE la folder WHERE FIND_IN_SET ( idFolderParent , @Ids)) Level FROM folder JOIN (SELECT @Ids: = 4) temp1) temp2

Mire SQL FIddle aquí: http://sqlfiddle.com/#!9/a2b4b3/312

Para obtener todos los niveles de hijos de un padre en particular, puede usar esta consulta a continuación:

  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 )