Si ceux qui n'ont pas de parents avaient null
dans leur parent
colonne, votre déclaration serait très simple :
SELECT id, name, parent FROM categories order by coalesce(parent, id), id;
Si vous insistez sur 0
ne représentant aucun parent, vous pouvez utiliser CASE WHEN ... THEN ...
plus verbeux déclaration.
Modifier :
-- 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