ora non so se questo mi ometodo sperimentale e' da definirsi "gestione orizzontale" , sta' di fatto che con una query sola tira fuori un array ordinato .

Per chi fosse interessato la classe e' qui:
http://www.devpro.it/php4_id_64.html

e questa e' una pagina di esempio, create un database di nome
test_tree e la tabella foglie come descritto nei commenti
codice:
<?php
/**
 * DATABASE test_tree
 * la tabella foglie puo' contenere quanti campi volete
 * unico VINCOLO e' il campo per il parent_id
 * che dovra' essere un VARCHAR
 * ------------------------------------------
 * CREATE TABLE foglie (
 *	id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
 *	descrizione VARCHAR( 255 ),
 *	link VARCHAR( 255 ),
 *	parent_id VARCHAR( 255 )
 * )
 * ------------------------------------------
 * NOTA: la tabella foglie va creata prima di usare la classe
 */

// dichiaro nome database e nome tabella foglie
$dbname = 'test_tree';
$fogliename = 'foglie';

// richiedo la classe
require( 'MySQL_TreeManager.class.php' );

// mi connetto al database
$db = &mysql_connect( 'localhost', 'root', 'password' );

// istanzio la classe passando connessione e nome database
$dbtree = &new MySQL_TreeManager( $db, $dbname );

// se non ci sono livelli, per fare il test, li creo
// per ricreare una strutura di esempio come quella di mircov
if( $dbtree->getLevels() == 0 ) {
        
        // setto il primo livello
        $dbtree->setLevels(1);
        
        // metto il "super" parent ( uno o piu' super parents, basta usare il NULL )
        $dbtree->addSubLevel( NULL, 'Programmazione', 'descrizione ramo programmazione' );
        
        // sotto livello di Programmazione
        $dbtree->addSubLevel( 'Programmazione', 'C', 'descrizione del linguaggio C' );
        
        // sottolivelli di Programmazione / C
        $dbtree->addSubLevel( Array( 'Programmazione', 'C' ), 'Guide', 'lista guide disponibili' );
        $dbtree->addSubLevel( Array( 'Programmazione', 'C' ), 'Tutorials', 'elenco dei tutorials disponibili' );
        
        // altro sotto livello di Programmazione
        $dbtree->addSubLevel( 'Programmazione', 'Pascal', 'descrizione del linguaggio Pascal' );
        
        // sottolivelli di Programmazione / Pascal
        $dbtree->addSubLevel( Array( 'Programmazione', 'Pascal' ), 'Guide', 'lista guide disponibili' );
        $dbtree->addSubLevel( Array( 'Programmazione', 'Pascal' ), 'Tutorials', 'elenco dei tutorials disponibili' );
        
        // un po' di "foglie"
        $foglia1 = $dbtree->getNode( 'Programmazione', 'C', 'Guide' );
        $foglia1 = 'INSERT INTO '.$fogliename.' VALUES ( NULL, "guida per il C", "http://www...", "'.$foglia1.'" )';
        
        $foglia2 = $dbtree->getNode( 'Programmazione', 'C', 'Tutorials' ); 
        $foglia2 = 'INSERT INTO '.$fogliename.' VALUES ( NULL, "tutorial per il C", "http://www...", "'.$foglia2.'" )';
        
        $foglia3 = $dbtree->getNode( 'Programmazione', 'Pascal', 'Guide' ); 
        $foglia3 = 'INSERT INTO '.$fogliename.' VALUES ( NULL, "guida per il Pascal", "http://www...", "'.$foglia3.'" )';
        
        $foglia4 = $dbtree->getNode( 'Programmazione', 'Pascal', 'Tutorials' ); 
        $foglia4 = 'INSERT INTO '.$fogliename.' VALUES ( NULL, "tutorial per il Pascal", "http://www...", "'.$foglia4.'" )';

        // popolo il database
        mysql_unbuffered_query( $foglia1 ) or die( mysql_error() );
        mysql_unbuffered_query( $foglia2 ) or die( mysql_error() );
        mysql_unbuffered_query( $foglia3 ) or die( mysql_error() );
        mysql_unbuffered_query( $foglia4 ) or die( mysql_error() );
}

// prendo l' Array associativo rilasciato dal metodo getArray
// passando il nome della tabella con le foglie
$queryTree = &$dbtree->getArray( $fogliename );

// controllo che non sia vuoto e stampo in var_dump
if( $queryTree !== false ) {
        echo '<pre>';
        var_dump( $queryTree );
        echo '</pre>';
} 
?>
risultato
codice:
array(1) {
  ["Programmazione"]=>
  array(3) {
    ["_description_"]=>
    string(31) "descrizione ramo programmazione"
    ["C"]=>
    array(3) {
      ["_description_"]=>
      string(28) "descrizione del linguaggio C"
      ["Guide"]=>
      array(2) {
        ["_description_"]=>
        string(23) "lista guide disponibili"
        [0]=>
        array(4) {
          [0]=>
          string(1) "1"
          [1]=>
          string(14) "guida per il C"
          [2]=>
          string(13) "http://www..."
          [3]=>
          string(5) "1|1|1"
        }
      }
      ["Tutorials"]=>
      array(2) {
        ["_description_"]=>
        string(32) "elenco dei tutorials disponibili"
        [0]=>
        array(4) {
          [0]=>
          string(1) "2"
          [1]=>
          string(17) "tutorial per il C"
          [2]=>
          string(13) "http://www..."
          [3]=>
          string(5) "1|1|2"
        }
      }
    }
    ["Pascal"]=>
    array(3) {
      ["_description_"]=>
      string(33) "descrizione del linguaggio Pascal"
      ["Guide"]=>
      array(2) {
        ["_description_"]=>
        string(23) "lista guide disponibili"
        [0]=>
        array(4) {
          [0]=>
          string(1) "3"
          [1]=>
          string(19) "guida per il Pascal"
          [2]=>
          string(13) "http://www..."
          [3]=>
          string(5) "1|2|3"
        }
      }
      ["Tutorials"]=>
      array(2) {
        ["_description_"]=>
        string(32) "elenco dei tutorials disponibili"
        [0]=>
        array(4) {
          [0]=>
          string(1) "4"
          [1]=>
          string(22) "tutorial per il Pascal"
          [2]=>
          string(13) "http://www..."
          [3]=>
          string(5) "1|2|4"
        }
      }
    }
  }
}

0.023606
il tutto sta' a vedere quanto si guadagna in prestazioni su databases di grandi dimensioni rispetto il metodo di mircov ( adesso su questa struttura molto semplice sto sugli 0.03 di tempo trascorso, vorrei sapere i tuoi tempi mircov ), pero' e' un' alternativa valida per la ricorsivita' di ricerca ( ihmo ? )

@ 13manuel84 , la classe l' ho aggiornata perche' il getNode in MySQL 4.1.9-nt dava uno strano risultato ... ora e' ok, fammi sapere se ti va bene anche sul tuo script, grazie