(Expliquant la perte de ORDER BYs
)
Le standard SQL dit essentiellement qu'une sous-requête est un ensemble non ordonné de lignes. Cela implique que l'optimiseur est libre d'ignorer le ORDER BYs
dans la table 'dérivée' :FROM ( SELECT ... ORDER BY )
. Dans les versions "récentes" de MySQL et MariaDB, de tels ORDER BYs
sont abandonnés. Il existe d'autres cas où ORDER BYs
est ignoré.
Dans certains situations (pas sûr de celle-ci), en ajoutant un LIMIT 99999999
(grand chiffre) après le ORDER BYs
trompe l'optimiseur en faisant le ORDER BYs
. Cependant, il est toujours libre d'ignorer la "commande" plus tard.
Une règle générale pour MySQL :évitez les sous-requêtes. (Il y a des cas où les sous-requêtes sont plus rapides, mais pas les vôtres.)
Une règle forte :vous devez avoir un ORDER BYs
le plus à l'extérieur si vous voulez que les résultats soient triés.
Si vous aviez ajouté LIMIT 3
à la table dérivée dans votre première requête, vous obtiendrez uniquement CHARLES, DAVID, JAMES, mais pas nécessairement dans cet ordre . Autrement dit, vous auriez besoin de deux ORDER BYs
- une dans la table dérivée, une à la toute fin.