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;