Parece um pouco complicado e inflexível o que você está fazendo aqui Gilles. Não seria melhor criar sua tabela de banco de dados com cada linha tendo seu próprio category_id e um parent_id? ou seja, dê aos pais de nível superior um parent_id de 0 e os filhos recebam o parent_id do category_id de seus pais. Isso lhe daria profundidade ilimitada e seria mais fácil codificar quando você estiver renderizando a árvore. Por exemplo:
SQL para seu primeiro nível de hierarquia -
SELECT * FROM (your_table) WHERE parent_id=0
SQL para seu segundo nível de hierarquia -
SELECT * FROM (your_table) WHERE parent_id=(category_id of first level)
SQL para seu terceiro nível de hierarquia -
SELECT * FROM (your_table) WHERE parent_id=(category_id of second level)
e assim por diante...