sql >> Base de Datos >  >> RDS >> Mysql

mysql:¿cómo guardar ORDER BY después de LEFT JOIN sin reordenar?

(Explicando la pérdida de ORDER BYs )

El estándar SQL esencialmente dice que una subconsulta es un conjunto desordenado de filas. Esto implica que el Optimizador es libre de ignorar el ORDER BYs en la tabla 'derivada':FROM ( SELECT ... ORDER BY ) . En versiones "recientes" de MySQL y MariaDB, tales ORDER BYs se están dejando caer. Hay otros casos en los que ORDER BYs se ignora.

En algunos situaciones (no estoy seguro de esta), agregando un LIMIT 99999999 (número grande) después de ORDER BYs engaña al optimizador para que realice el ORDER BYs . Sin embargo, todavía es libre de ignorar el "pedido" más adelante.

Una regla general para MySQL:Evite las subconsultas. (Hay casos en los que las subconsultas son más rápidas, pero no en el suyo).

Una regla estricta:debes tener un ORDER BYs en el exterior si desea ordenar los resultados.

Si hubiera agregado LIMIT 3 a la tabla derivada en su primera consulta, obtendría solo CHARLES, DAVID, JAMES, pero no necesariamente en ese orden . Es decir, necesitaría dos ORDER BYs - uno en la tabla derivada, uno al final.