Normalmente yo hago una sola consulta, leyendo todas las categorías y cargándolas en un array.
Todo en pseudo-código.
Según tu ejemplo (suponiendo las ID):
Código:
- 1 - DEPORTES
-- 2 - TIERRA
--- 3 - FUTBOL
---- 4 - FUTBOL BASE
---- 5 - FUTBITO
---- 6 - FUTBOL PROFESIONAL
--- 7 - SKY
--- 8 - TENIS
-- 9 - MAR
---- 10 - REMO
La idea es crear un array con un elemento 'todos' que contendrá la información de cada categoría/subcategoría y un elemento para cada categoría que tenga hijos:
Código:
todos => array(
// ID ID, Nombre, Padre
1 => array(1, DEPORTES, 0)
2 => array(2, TIERRA, 1)
3 => array(3, FUTBOL, 2)
4 => array(4, FUTBOL BASE, 3)
5 => array(5, FUTBITO, 3)
6 => array(6, FUTBOL PROFESIONAL, 3)
7 => array(7, SKY, 2)
8 => array(8, TENIS, 2)
9 => array(9, MAR, 1)
10 => array(10, REMO, 9)
)
// Como categoría padre solo está deportes
0 => array(1)
// Deportes tiene 2 hijos: TIERRA y MAR
1 => array(2, 9)
// Tierra tiene 3 hijos: FUTBOL, SKY y TENIS
2 => array(3, 7, 8)
// Futbol tiene 3 hijos
3 => array(4, 5, 6)
// Mar tiene un hijo
9 => array(10)
Después de cargarlas todas, puedes hacer una función (recursiva o no, según necesites) para mostrar todo:
Código:
funcion verCategorias(padre = 0) {
foreach(categorias[padre] as id) {
print categorias['todos'][id]['nombre']
// Revisar si la categoría tiene hijos
if(isset(categorias[id])) {
verCategorias(id)
}
}
}
La ventaja de hacerlo así es que economizas recursos al reducir la cantidad de consultas y, además, puedes crear un archivo de caché para agilizar aún más el proceso.