Aquí es un simple de una sola consulta MySQL-solución:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
Sólo sustituir <id>
con el elemento de matriz de ID
.
Esto devolverá una cadena con los ID
s de todos los descendientes del elemento con ID
= <id>
, separadas por ,
. Si se quiere tener múltiples filas devueltas, con un descendiente en cada fila, se puede usar algo como esto:
SELECT *
FROM `table_name`
WHERE FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
Incluyendo el elemento raíz/padre
El PO pidió a los hijos de una elemento, que se responde arriba. En algunos casos, puede ser útil incluir el elemento raíz/principal en el resultado. Aquí están mis soluciones sugeridas:
cadena separada por comas de identificadores:
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT <id> Level
UNION
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
múltiples filas:
SELECT *
FROM `table_name`
WHERE `ID` = <id> OR FIND_IN_SET(`ID`, (
SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`ID` SEPARATOR ',')
FROM `table_name`
WHERE FIND_IN_SET(`parent_id`, @Ids)
) Level
FROM `table_name`
JOIN (SELECT @Ids := <id>) temp1
) temp2
))
Hay una manera de tener la recursividad en una consulta SQL sin formato en los RDBMS que lo apoyan, como PostgreSQL – shesek
Esta página web de devolución de enlace no está disponible – HMagdy