Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql:comment enregistrer ORDER BY après LEFT JOIN sans réorganiser?

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