Mysql
 sql >> Database >  >> RDS >> Mysql

mysql:come salvare ORDER BY dopo LEFT JOIN senza riordinare?

(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.