fatto ... allora, la cosa importante e' usare, nella seconda query, il mysql_num_row perche' se le sottocategorie hanno tutte lo stesso nome per il campo, il mysql_fetch_assoc prende il solo campo per riferimento ... comunque adesso ti posto il codice da me usato:

nome database per la prova:
prove

dump del database
codice:
-- --------------------------------------------------------

-- 
-- Table structure for table `categories`
-- 

CREATE TABLE `categories` (
  `id` int(10) NOT NULL auto_increment,
  `category` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-- 
-- Dumping data for table `categories`
-- 

INSERT INTO `categories` (`id`, `category`) VALUES (1, 'category_0'),
(2, 'category_1'),
(3, 'category_2'),
(4, 'category_3');

-- --------------------------------------------------------

-- 
-- Table structure for table `category_0`
-- 

CREATE TABLE `category_0` (
  `id` int(10) NOT NULL auto_increment,
  `category` varchar(100) default NULL,
  `parent_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- 
-- Dumping data for table `category_0`
-- 

INSERT INTO `category_0` (`id`, `category`, `parent_id`) VALUES (1, 'Food', 0),
(2, 'Games', 0);

-- --------------------------------------------------------

-- 
-- Table structure for table `category_1`
-- 

CREATE TABLE `category_1` (
  `id` int(10) NOT NULL auto_increment,
  `category` varchar(100) default NULL,
  `parent_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

-- 
-- Dumping data for table `category_1`
-- 

INSERT INTO `category_1` (`id`, `category`, `parent_id`) VALUES (1, 'Fruit', 1),
(2, 'Meat', 1),
(3, 'Pac Man', 2);

-- --------------------------------------------------------

-- 
-- Table structure for table `category_2`
-- 

CREATE TABLE `category_2` (
  `id` int(10) NOT NULL auto_increment,
  `category` varchar(100) default NULL,
  `parent_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-- 
-- Dumping data for table `category_2`
-- 

INSERT INTO `category_2` (`id`, `category`, `parent_id`) VALUES (1, 'Red', 1),
(2, 'Yellow', 1),
(3, 'Breef', 2),
(4, 'Pork', 2);

-- --------------------------------------------------------

-- 
-- Table structure for table `category_3`
-- 

CREATE TABLE `category_3` (
  `id` int(10) NOT NULL auto_increment,
  `category` varchar(100) default NULL,
  `parent_id` int(10) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

-- 
-- Dumping data for table `category_3`
-- 

INSERT INTO `category_3` (`id`, `category`, `parent_id`) VALUES (1, 'Cherry', 1),
(2, 'Banana', 2);


codice di prova
codice:
mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'prove' );
$query = &mysql_unbuffered_query( 'SELECT category FROM categories' );
while( $r = &mysql_fetch_row( $query ) ) {
	if( isSet( $newquery ) == false ) {
		$newquery = 'SELECT * FROM '.$r[0].'';
		$oldr = &$r[0];
	}
	else {
		$newquery .= ' LEFT JOIN '.$r[0].' ON '.$oldr.'.id = '.$r[0].'.parent_id';
		$oldr = &$r[0];
	}
}
// qui se vuoi fare una prova in phpMyAdmin ti rendi subito
// conto che hai tutta la gerarchia gia' strutturata ...
// echo $newquery; // poi la usi in phpMyAdmin


$TableMapping = 3; // IMPORTANTE
// questa variabile e' fondamentale perche' tramite
// phpMyAdmin o altri devi vedere , in base alle tue tabelle
// ogni quanto esiste quella chiamata categoria, perche' sono tute uguali ( devono esserlo ) ... in questo caso ogni 3 
// colonne c'e' la corrispettiva per categoria


$StartMapping = 1; // IMPORTANTE
// questa invece indica qual'e' la prima colonna contenente le informazioni per categoria

$queryTree = Array();
$globalKeys = '';
$query = &mysql_unbuffered_query( $newquery );
while( $r = &mysql_fetch_row( $query ) ) {

	$a = $StartMapping;
	$arrayKeys = '$queryTree';
	while( isSet( $r[$a] ) ) {
	        $arrayKeys .= '[\\''.$r[$a].'\\']';
		$a+= $TableMapping;
	}
	$globalKeys .= $arrayKeys.' = Array();';
}
eval( $globalKeys );
echo '<pre>';
var_dump( $queryTree );
echo '</pre>';
2 query di cui una irrisoria ( quella per i nomi delle sotto tabelle ) ed una sola query per tutti i risultati che vuoi .

In questo caso ho solo creato la gerarchia, ma aggiungendo poche riche puoi crearti anche valori interni per ogni ramo della gerarchia ...


Per la dinamicita' ti basta aggiungere altre tabelle in database e scrivere il loro nome ( in ordine di gerarchia ) sulla tabella categories .


fammi sapere