mysql

Mysql select recursive get all child with multiple level



(6)

Aquí está el que funciona

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

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

yo lleno esta tabla por

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 elemento secundario para esta carpeta y la 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


Es posible que funcione si no desea que la identificación principal en el resultado elimine SELECT 4 Level UNION de la consulta

SELECT GROUP_CONCAT (Level SEPARATOR '','') FROM (SELECT 4 Level UNION SELECT @Ids: = (SELECT GROUP_CONCAT ( idFolder SEPARATOR '','') FROM folder WHERE FIND_IN_SET ( idFolderParent , @Ids)) Level FROM folder JOIN (SELECT @Ids: = 4) temp1) temp2

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


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 podría encontrar una forma que funcione para mí (al menos mejor que las otras respuestas).

Los datos con los que la primera y la segunda consulta no funcionan 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 utiliza la primera y la segunda consulta en este conjunto de datos, para el 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'')

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;

(el FIND_IN_SET )


para obtener todos los niveles secundarios 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 )


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 se encuentra a continuación me da este error para diferentes intercalaciones. 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;