Ya te he puesto la tabla
idItem,Item,idItemPadre,nivel,orden,accion
1, Perro, Null,0,1,Null
2,Jack Russel,1,1,abrir('Jack Russel')
3,Caniche,2,2,abrir('Caniche')
4,Pastor Aleman,1,3,abrir('Pastor Aleman')
5,Gato,Null,0,2,Null
6,Abisinio,5,1,1,abrir('Abisinio')
7,American Curl,5,1,2,abrir('American Curl')
8,Burmés,5,1,3,abrir('Burmés')
el contenido de accion es un ejemplo tonto es para poner algo
Ahora necesitas una query que retorne los items en ese orden,
no vale ORDER BY idItem por razones obvias....
El join consigo misma nos proporciona cada item emparejado con los datos de su padre, si tiene. Luego hay que jugar con ORDER BY para conseguir el orden, no tengo aquí la solución. (Recuerda que un campo null se ordena al final de la lista con if(itm2.orden is null,0,1) invertimos esa logica).
Si solo tienes dos niveles, padres e hijos, la cosa se simplifica pero se puede conseguir una query que ordene bien para un numero indefinido de niveles.