Você está obtendo o resultado esperado. Se você tiver o conjunto de resultados
a,b,c,d
, você está começando com a
que é uma categoria pai, portanto, retrocede até o início do conjunto e itera por a,b,c,d
novamente como subcategorias. Agora você está no final do conjunto, então ambos os loops serão encerrados, pois não há mais dados. O que você provavelmente quer fazer é ler todos os dados em um array PHP primeiro, então iterar sobre isso e construir algum tipo de estrutura em árvore. Você também pode construir sua estrutura de árvore diretamente no loop mysql_fetch.
Dependendo do que você está tentando alcançar, também existem maneiras melhores de armazenar seus dados. Vale a pena ler sobre como armazenar árvores e dados hierárquicos em SQL. Conjuntos aninhados são provavelmente o que você deseja.
Outra coisa:não use
mysql_fetch_array
, use mysql_fetch_assoc
em vez de. Caso contrário, você acaba com chaves numéricas e associativas e uma matriz de linhas que contém o dobro da quantidade de dados que deveria.