Hay dos métodos básicos para hacer esto:listas de adyacencia y listas anidadas. Eche un vistazo a Administración de datos jerárquicos en MySQL .
Lo que tienes es una lista de adyacencia. No, no hay una forma de capturar recursivamente a todos los descendientes con una sola declaración SQL. Si es posible, cógelos todos y mapéalos en código.
Los conjuntos anidados pueden hacer lo que quieras, pero tiendo a evitarlo porque el costo de insertar un registro es alto y es propenso a errores.