(Spiegando la perdita di ORDER BYs
)
Lo standard SQL dice essenzialmente che una sottoquery è un insieme non ordinato di righe. Ciò implica che l'Ottimizzatore è libero di ignorare ORDER BYs
nella tabella 'derivato':FROM ( SELECT ... ORDER BY )
. Nelle versioni "recenti" di MySQL e MariaDB, tali ORDER BYs
vengono abbandonati. Ci sono altri casi in cui ORDER BYs
viene ignorato.
In alcuni situazioni (non sono sicuro di questa), aggiungendo un LIMIT 99999999
(numero grande) dopo il ORDER BYs
induce l'ottimizzatore a eseguire ORDER BYs
. Tuttavia, è ancora libero di ignorare l'"ordine" in un secondo momento.
Una regola generale per MySQL:evitare le sottoquery. (Ci sono casi in cui le sottoquery sono più veloci, ma non le tue.)
Una regola forte:devi avere un ORDER BYs
sulla parte più esterna se vuoi che i risultati siano ordinati.
Se avevi aggiunto LIMIT 3
nella tabella derivata nella tua prima query, otterresti solo CHARLES, DAVID, JAMES, ma non necessariamente in quell'ordine . Cioè, avresti bisogno di due ORDER BYs
- uno nella tabella derivata, uno alla fine.