Quelque chose comme ça pourrait peut-être fonctionner :
SELECT *
FROM categories
ORDER BY IF(parent_id, parent_id, category_id), parent_id, display_order
mais comme il ne peut pas utiliser d'index, ce sera lent. (N'a pas testé cependant, peut-être tort)
Le premier ORDER BY
la condition trie les parents et les enfants ensemble; puis le second assure que le parent précède ses enfants; le troisième trie les enfants entre eux.
De plus, cela ne fonctionnera évidemment que dans le cas que vous avez directement décrit, où vous avez une hiérarchie à deux niveaux.