ANSI SQL standard :) ....
mysql je do 4.1.xx postovao taj order by a onda je od te neke verzije prestao zato sto po ANSI standardu to ne treba (nije problem ako postujes ali ne moras) da se postuje a ako se izbaci taj order by mysql optimizer moze da izvrsi dodatne optimizacije koje ce taj komplet upita odraditi brze.
dodatno, imas issue, opet po ansi standardu, i opet vrlo cesta greska kod klijenata ... ako tvoj "konacni" upit nema ORDER BY, redosled po kom ce ti mysql vratiti podatke je "NEPOZNAT" ... sta to znaci ... cak i ako koristis LIMIT to ce samo odrediti koji podaci ce se naci u tim upitima u zagradi a rezultat ce biti sortiran "prvi" pa "drugi" samo zato sto je tako "slucajno brze" ... ali ti to nije garantovano!!!! mozda ce u sledecoj verziji to da ti vrati skroz izmesano!!
imas isto standardan primer ... select * from t1 where a>b; ce ti vratiti ako je t1 innodb tabela podatke sortirane po primarnom kljucu iako ne postoji nikakav order by u upitu - ali ti to mysql ne garantuje!! .. isto tako, ako imas single node cluster, taj upit ce ti vratiti podatke sortirane po pk-u, ali ako imas 4 node cluster dobices podatke koji su "skoro random" (tj dobices sortirane grupe od po 25% podataka medjusobno mergeovane) ... zo, ako oces da ti vrati upit sortirane podatke, dodas jedan order by na kraj...
za tvoj upit, ako ti je bitno da budu, prvo prvi pa onda drugi ... uradis nesto tipa
Code:
(
SELECT item.title as A, item.title_url_format as B, (COUNT(parent.id) - 1) AS C, item.lft as D, 0 as E
FROM entries item, entries parent
WHERE (item.lft BETWEEN parent.lft AND parent.rgt) AND item.type = 'item' AND item.status = 'published'
GROUP BY item.id
)
UNION ALL
(
SELECT title as A, 'page' as B, 0 ac C, id as D, 1 as E FROM pages
)
ORDER BY E,D;
nadam se da je "trik" jasan