Parece un poco complicado e inflexible lo que estás haciendo aquí, Gilles. ¿No sería mejor crear su tabla de base de datos con cada fila con su propio category_id y parent_id? es decir, asigne a los padres de nivel superior un parent_id de 0 y los hijos tomen el parent_id del category_id de sus padres. Esto le daría una profundidad ilimitada y será más fácil de codificar cuando esté representando el árbol. Por ejemplo:
SQL para su primer nivel de jerarquía -
SELECT * FROM (your_table) WHERE parent_id=0
SQL para su segundo nivel de jerarquía -
SELECT * FROM (your_table) WHERE parent_id=(category_id of first level)
SQL para su tercer nivel de jerarquía -
SELECT * FROM (your_table) WHERE parent_id=(category_id of second level)
y así sucesivamente...