Puedes usar estas funciones:
Código PHP:
function despliegaCategorias() {
$sql = "SELECT `id`, `nombre` FROM `categorias` WHERE `ref`='0' ORDER BY `nombre` ASC"; // Buscar todas las categorias "padre"
$result = mysql_query( $sql ) or die( mysql_error() );
echo "Empezar listado:<br>";
while( $row = mysql_fetch_array( $result ) ) {
echo $row['nombre'] . "<br>";
listaHijos( "-", $row['id'] );
}
echo "Termiando de listar";
}
function listaHijos( $prefix = '', $id ) {
$sql = "SELECT `id`, `nombre` FROM `categorias` WHERE `ref`='$id' ORDER BY `nombre` ASC"; // Buscar las categorias de este padre
$result = mysql_query( $sql ) or die( mysql_error() );
if( mysql_num_rows( $result ) == 0 ) {
return; // No hay categorias "hijo"
}
while( $row = mysql_fetch_array( $result ) ) {
echo $prefix . $row['nombre'];
listaHijos( $prefix . "-", $row['id'] );
}
}
Ojo esto puede causar mucha recursion y tener luego un problema de estabilidad, lo mas recomendable y deseable, es que solo corras esta funcion 1 vez, y generes un array o una estructura, que luego puedas serializar y guardar en tu base de datos, implementando lo que se conoce como "caching", para evitar generar codigos muy intensos para PHP y para la base de datos.