Já que você está atualmente com 3 níveis somente, você poderia descrever isso com JOINs ao invés de executar varias queries recursivamente.
Exemplo:
CREATE TABLE /*!32300 IF NOT EXISTS*/ categorias (
id int(10) unsigned NOT NULL auto_increment,
id_pai int(10) unsigned ,
nome varchar(30) NOT NULL DEFAULT '' ,
PRIMARY KEY (id),
INDEX Subcategoria (id_pai)
);
INSERT INTO categorias VALUES("1",NULL,"Linguagens");
INSERT INTO categorias VALUES("2","1","Procedurais");
INSERT INTO categorias VALUES("3","2","C");
INSERT INTO categorias VALUES("4","1","OO");
INSERT INTO categorias VALUES("5","1","Funcionais");
INSERT INTO categorias VALUES("6","5","Haskell");
Query:
SELECT
pai.id,
pai.nome AS Categoria,
sub.nome AS Subcategoria,
sub2.nome AS Subcategoria2
FROM categorias AS pai
LEFT JOIN categorias AS sub
ON sub.id_pai = pai.id
LEFT JOIN categorias AS sub2
ON sub2.id_pai = sub.id
WHERE pai.id_pai IS NULL
ORDER BY NULL
Executando a query teremos:
mysql> SELECT
-> pai.id,
-> pai.nome AS Categoria,
-> sub.nome AS Subcategoria,
-> sub2.nome AS Subcategoria2
-> FROM categorias AS pai
-> LEFT JOIN categorias AS sub
-> ON sub.id_pai = pai.id
-> LEFT JOIN categorias AS sub2
-> ON sub2.id_pai = sub.id
-> WHERE pai.id_pai IS NULL
-> ORDER BY NULL;
+----+------------+--------------+---------------+
| id | Categoria | Subcategoria | Subcategoria2 |
+----+------------+--------------+---------------+
| 1 | Linguagens | Procedurais | C |
| 1 | Linguagens | OO | NULL |
| 1 | Linguagens | Funcionais | Haskell |
+----+------------+--------------+---------------+
3 rows in set (0.00 sec)
Uma técnica de busca em árvore usando SQL podem ser vistas em:
http://jan.kneschke....ojects/mysql/sp
Edição feita por: Eclesiastes, 27/05/2007, 10:30.