Se aqueles sem pais tivessem
null
em seu parent
coluna, sua declaração seria muito simples:SELECT id, name, parent FROM categories order by coalesce(parent, id), id;
Se você insistir em
0
representando nenhum pai, você pode usar CASE WHEN ... THEN ...
mais detalhado demonstração. Editar:
-- Sorting by name instead
select a.id, a.name, a.parent
from categories a left join categories b on a.parent=b.id
order by coalesce(b.name, a.name), a.name