(Explicando a perda de
ORDER BY
) O padrão SQL essencialmente diz que uma subconsulta é um conjunto não ordenado de linhas. Isso implica que o Optimizer é livre para ignorar o
ORDER BY
na tabela 'derivada':FROM ( SELECT ... ORDER BY )
. Nas versões "recentes" do MySQL e do MariaDB, como ORDER BYs
estão sendo descartados. Existem outros casos em que ORDER BY
é ignorado. Em algumas situações (não tenho certeza sobre este), adicionando um
LIMIT 99999999
(número grande) após o ORDER BY
engana o Otimizador para fazer o ORDER BY
. No entanto, ainda é livre para ignorar a "ordem" mais tarde. Uma regra geral para MySQL:Evite subconsultas. (Há casos em que as subconsultas são mais rápidas, mas não as suas.)
Uma regra forte:você deve tem um
ORDER BY
no mais externo se você quiser que os resultados sejam classificados. Se você adicionou
LIMIT 3
para a tabela derivada em sua primeira consulta, você obteria apenas CHARLES, DAVID, JAMES, mas não necessariamente nessa ordem . Ou seja, você precisaria de dois ORDER BYs
- um na tabela derivada, um no final.