Als degenen zonder ouders null . hadden in hun parent kolom, zou uw verklaring heel eenvoudig zijn:
SELECT id, name, parent FROM categories order by coalesce(parent, id), id;
Als je aandringt op 0 geen ouder vertegenwoordigt, kunt u meer uitgebreide CASE WHEN ... THEN ... . gebruiken verklaring.
Bewerken:
-- 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